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?
Funciona bien en GCC 4.6.1, incluso con '[this]'. –
@KerrekSB Es bueno saber ... ¡Gracias por la prueba! – Gabriel
Esto se parece a [error # 560907] (https://connect.microsoft.com/VisualStudio/feedback/details/560907/capturing-variables-in-nested-lambdas) (cerrado como 'WONTFIX', desafortunadamente). –