Si consideri il seguente codice:Perché non riesco a catturare il "questo" puntatore da un 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() {}
};
In VC2010, utilizzando this
invece di a
portare a errori di compilazione. Tra gli altri:
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
Che non capisco. Significa che non sa se dovrebbe usare un riferimento o copiarlo? Quando si tenta di utilizzare &this
per forzare riferimento, si dice anche:
1>main.cpp(20): error C3496: 'this' is always captured by value: '&' ignored
Il temporaneo non è che fastidioso, ma per il bene di curiosità, c'è un modo per sbarazzarsi di esso? Cosa succede quando lo this
viene assegnato a una lambda?
Funziona bene in GCC 4.6.1, anche con '[this]'. –
@KerrekSB Buono a sapersi ... Grazie per il test! – Gabriel
Questo sembra [bug # 560907] (https://connect.microsoft.com/VisualStudio/feedback/details/560907/capturing-variables-in-nested-lambdas) (chiuso come 'WONTFIX', sfortunatamente). –