La raison [&this]
ne fonctionne pas, c'est qu'il s'agit d'une erreur de syntaxe. Chaque paramètre séparé par des virgules dans le lambda-introducer
est un capture
:
capture:
identifier
& identifier
this
Vous pouvez voir que la &this
syntaxe n'est pas autorisée. La raison pour laquelle il n'est pas autorisé est que vous ne voudriez jamais capturer this
par référence, car il s'agit d'un petit pointeur const. Vous ne voudrez jamais le transmettre que par valeur - donc le langage ne prend tout simplement pas en charge la capture this
par référence.
Pour capturer this
explicitement, vous pouvez utiliser [this]
comme lambda-introducer
.
Le premier capture
peut être un capture-default
qui est:
capture-default:
&
=
Cela signifie capturer automatiquement tout ce que j'utilise, par référence ( &
) ou par valeur (=
) respectivement - cependant le traitement de this
est spécial - dans les deux cas, il est capturé par valeur pour les raisons données précédemment (même avec une capture par défaut de &
, ce qui signifie généralement capture par référence).
5.1.2.7/8:
Aux fins de la recherche de nom (3.4), déterminer le type et la valeur de this
(9.3.2) et de la transformation des expressions id faisant référence aux membres de classe non statiques en expressions d'accès aux membres de la classe en utilisant (*this)
(9.3.1), l'instruction composée [OF THE LAMBDA] est considéré dans le contexte de l'expression lambda.
Ainsi, le lambda agit comme s'il faisait partie de la fonction membre englobante lors de l'utilisation de noms de membres (comme dans votre exemple l'utilisation du nom x
), donc il générera des «utilisations implicites» de la this
même manière qu'une fonction membre.
Si une capture lambda inclut une capture par défaut &
, les identificateurs de la capture lambda ne doivent pas être précédés de &
. Si une capture lambda inclut une capture par défaut qui est =
, la capture lambda ne doit pas contenir
this
et chaque identifiant qu'elle contient doit être précédé de&
. Un identifiant outhis
ne doit pas apparaître plus d'une fois dans une capture lambda.
Vous pouvez donc utiliser [this]
, [&]
, [=]
ou [&,this]
commelambda-introducer
pour capturer le this
pointeur en valeur.
Cependant [&this]
et [=, this]
sont mal formés. Dans le dernier cas, gcc avertit avec indulgence pour [=,this]
cela explicit by-copy capture of ‘this’ redundant with by-copy capture default
plutôt que pour des erreurs.
this
ne peut pas être modifiée, elle n'est pas assez grande pour faire une référence plus rapidement ... et de toute façon , elle n'existe pas , donc elle a pas de vie réelle, ce qui signifie que toute référence à celle-ci serait suspendue par définition.this
est une prvalue, pas une lvalue.