Il motivo [&this]non funziona è perché si tratta di un errore di sintassi. Ogni parametro separato da virgole in lambda-introducerè un capture:
capture:
identifier
& identifier
this
Puoi vedere che &thisnon è consentito sintatticamente. Il motivo per cui non è consentito è perché non vorresti mai acquisire thisper riferimento, poiché si tratta di un piccolo puntatore const. Vorresti solo passarlo per valore, quindi la lingua non supporta l'acquisizione thisper riferimento.
Per catturare in modo thisesplicito puoi usare [this]come file lambda-introducer.
Il primo capturepuò essere un capture-defaultche è:
capture-default:
&
=
Ciò significa catturare automaticamente tutto ciò che uso, rispettivamente per riferimento ( &) o per valore ( =) - tuttavia il trattamento di thisè speciale - in entrambi i casi viene catturato per valore per le ragioni fornite in precedenza (anche con un'acquisizione predefinita di &, che di solito significa cattura per riferimento).
5.1.2.7/8:
Ai fini della ricerca del nome (3.4), determinando il tipo e il valore di this(9.3.2) e trasformando espressioni id che si riferiscono a membri di classi non statiche in espressioni di accesso ai membri di classe usando (*this)(9.3.1), l'istruzione composta [OF THE LAMBDA] è considerato nel contesto dell'espressione lambda.
Quindi il lambda si comporta come se fosse parte della funzione membro che lo racchiude quando si usano i nomi dei membri (come nel tuo esempio l'uso del nome x), quindi genererà "usi impliciti" thisproprio come fa una funzione membro.
Se un'acquisizione lambda include un'acquisizione predefinita &, gli identificatori nell'acquisizione lambda non devono essere preceduti da &. Se un'acquisizione lambda include un'acquisizione predefinita, ovvero =l'acquisizione lambda non deve contenere
this e ogni identificatore che contiene deve essere preceduto da &. Un identificatore o thisnon deve apparire più di una volta in una cattura lambda.
Così si può utilizzare [this], [&],[=] o [&,this]come lambda-introducerper catturare il thispuntatore per valore.
Tuttavia [&this]e [=, this]sono mal formati. In quest'ultimo caso gcc avverte forgivingly per [=,this]che explicit by-copy capture of ‘this’ redundant with by-copy capture default, piuttosto che errori.
thisnon può essere modificato, non è abbastanza grande per fare un riferimento più velocemente ... e comunque , in realtà non esiste , quindi ha nessuna vita reale, il che significa che qualsiasi riferimento ad essa sarebbe sospeso per definizione.thisè un prvalue, non un lvalue.