La razón [&this]
no funciona es porque es un error de sintaxis. Cada parámetro separado por comas en el lambda-introducer
es un capture
:
capture:
identifier
& identifier
this
Puede ver que eso &this
no está permitido sintácticamente. La razón por la que no está permitido es porque nunca querría capturar this
por referencia, ya que es un pequeño puntero constante. Solo querrá pasarlo por valor, por lo que el lenguaje simplemente no admite la captura this
por referencia.
Para capturar this
explícitamente, puede usar [this]
como lambda-introducer
.
El primero capture
puede ser un capture-default
que es:
capture-default:
&
=
Esto significa capturar automáticamente todo lo que uso, por referencia ( &
) o por valor ( =
) respectivamente, sin embargo, el tratamiento de this
es especial, en ambos casos se captura por valor por las razones dadas anteriormente (incluso con una captura predeterminada de &
, que generalmente significa capturar por referencia).
5.1.2.7/8:
Para propósitos de búsqueda de nombre (3.4), determinar el tipo y valor de this
(9.3.2) y transformar expresiones id que se refieren a miembros de clase no estáticos en expresiones de acceso a miembros de clase usando (*this)
(9.3.1), la declaración compuesta [OF THE LAMBDA] se considera en el contexto de la expresión lambda.
Entonces, lambda actúa como si fuera parte de la función miembro adjunta cuando se usan nombres de miembros (como en su ejemplo, el uso del nombre x
), por lo que generará "usos implícitos" de la this
misma manera que lo hace una función miembro.
Si una captura lambda incluye una captura predeterminada &
, es decir , los identificadores en la captura lambda no deben ir precedidos de &
. Si una captura lambda incluye un valor predeterminado de captura =
, es decir , la captura lambda no contendrá
this
y cada identificador que contenga estará precedido por &
. Un identificador o this
no aparecerá más de una vez en una captura lambda.
Así que usted puede utilizar [this]
, [&]
, [=]
o [&,this]
como lambda-introducer
para capturar el this
puntero por valor.
Sin embargo [&this]
y [=, this]
están mal formados. En el último caso, gcc advierte con perdón por [=,this]
eso en explicit by-copy capture of ‘this’ redundant with by-copy capture default
lugar de errores.
this
no se puede cambiar, no es lo suficientemente grande para hacer una referencia más rápido ... y de todos modos , en realidad no existe , por lo que ha ninguna vida real, lo que significa que cualquier referencia a ella estaría pendiente por definición.this
es un valor pr, no un valor l.