2011-10-19 11 views
8

Considere el siguiente código:¿Por qué no puedo capturar el puntero "this" con una lambda?

class A 
{ 
public: 
    void foo() 
    { 
     auto functor = [this]() 
      { 
       A * a = this; 
       auto functor = [a]() // The compiler won't accept "this" instead of "a" 
        { 
         a->bar(); 
        }; 
      }; 
    } 

    void bar() {} 
}; 

En VC2010, utilizando this en lugar de a conducen a errores de compilación. Entre otros:

1>main.cpp(20): error C3480: '`anonymous-namespace'::<lambda0>::__this': a lambda capture variable must be from an enclosing function scope 
1>main.cpp(22): error C3493: 'this' cannot be implicitly captured because no default capture mode has been specified 

Lo que no entiendo. ¿Significa que no sabe si debería usar una referencia o copiarla? Al intentar utilizar &this a la fuerza de referencia, también dice:

1>main.cpp(20): error C3496: 'this' is always captured by value: '&' ignored 

El temporal no es que molesto, pero en aras de la curiosidad, ¿hay una manera de deshacerse de él? ¿Qué sucede cuando se da this a una lambda?

+2

Funciona bien en GCC 4.6.1, incluso con '[this]'. –

+0

@KerrekSB Es bueno saber ... ¡Gracias por la prueba! – Gabriel

+4

Esto se parece a [error # 560907] (https://connect.microsoft.com/VisualStudio/feedback/details/560907/capturing-variables-in-nested-lambdas) (cerrado como 'WONTFIX', desafortunadamente). –

Respuesta

6

Esto parece ser un error del compilador en VS2010. Yo era capaz de hacer que funcione al permitir que el lambda interior implícitamente capturar this:

class A 
{ 
public: 
    void foo() 
    { 
     auto functor = [this]() 
     { 
      auto functor = [=]() 
      { 
       bar(); 
      }; 
     }; 
    } 

    void bar() {} 
}; 

Al intentar utilizar & esta forzar referencia, también dice:

1> principal. CPP (20): error C3496: 'esto' siempre es capturado por valor: '&' ignorado

this solo se puede capturar por valor. [=] y [&] ambos lo capturan por valor.

¿Qué sucede cuando esto se da a una lambda?

No sé pero debe ser algo especial porque no se puede utilizar en un this lambda como un puntero al objeto lambda. Cualquier otra cosa capturada se convierte en un miembro privado de la lambda, así que presumiblemente this también pero hay un manejo especial en el uso.

2

This is a known bug with the Visual Studio 2010 compiler (como se menciona en el comentario de Frédéric Hamidi).

Tiene que capturar explícitamente this para pasarla a la especificación de captura de otro lamba. Esto también se aplica a las variables locales declaradas fuera de la lambda adjunta de la lambda, incluso con una especificación de captura [&].

Cuestiones relacionadas