2011-10-19 8 views
8

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?

+2

Funziona bene in GCC 4.6.1, anche con '[this]'. –

+0

@KerrekSB Buono a sapersi ... Grazie per il test! – Gabriel

+4

Questo sembra [bug # 560907] (https://connect.microsoft.com/VisualStudio/feedback/details/560907/capturing-variables-in-nested-lambdas) (chiuso come 'WONTFIX', sfortunatamente). –

risposta

6

Questo sembra essere un bug del compilatore in VS2010. Sono stato in grado di farlo funzionare lasciando il lambda interna implicitamente catturare this:

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

    void bar() {} 
}; 

Quando si cerca di utilizzare & questo per forzare riferimento, si dice anche:

1> principale. cpp (20): errore C3496: 'questo' è sempre catturato per valore: '&' ignorato

this può essere catturato solo in base al valore. [=] e [&] entrambi catturano per valore.

Cosa succede quando questo viene dato a un lambda?

Non lo so, ma deve essere qualcosa di speciale, perché non è possibile utilizzare this in un lambda come un puntatore all'oggetto lambda. Tutto il resto catturato diventa un membro privato della lambda, quindi presumibilmente lo fa anche this ma c'è un trattamento speciale sull'utilizzo.

2

This is a known bug with the Visual Studio 2010 compiler (come riferito dal commento di Frédéric Hamidi).

È necessario acquisire esplicitamente this per passarlo a un'altra specifica di acquisizione di lamba. Questo vale anche per le variabili locali dichiarate al di fuori lambda lambda, anche con una specifica di acquisizione [&].

Problemi correlati