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 &this
non è consentito sintatticamente. Il motivo per cui non è consentito è perché non vorresti mai acquisire this
per riferimento, poiché si tratta di un piccolo puntatore const. Vorresti solo passarlo per valore, quindi la lingua non supporta l'acquisizione this
per riferimento.
Per catturare in modo this
esplicito puoi usare [this]
come file lambda-introducer
.
Il primo capture
può essere un capture-default
che è:
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" this
proprio 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 this
non deve apparire più di una volta in una cattura lambda.
Così si può utilizzare [this]
, [&]
,[=]
o [&,this]
come lambda-introducer
per catturare il this
puntatore 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.
this
non 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.