Der Grund [&this]
dafür ist, dass es sich um einen Syntaxfehler handelt. Jeder durch Kommas getrennte Parameter in lambda-introducer
ist ein capture
:
capture:
identifier
& identifier
this
Sie können sehen, dass &this
dies syntaktisch nicht zulässig ist. Der Grund, warum dies nicht zulässig ist, liegt darin, dass Sie niemals this
als Referenz erfassen möchten , da es sich um einen kleinen const-Zeiger handelt. Sie möchten es immer nur als Wert übergeben - daher unterstützt die Sprache die Erfassung einfach nichtthis
Referenz .
Um this
explizit zu erfassen , können Sie [this]
als verwenden lambda-introducer
.
Das erste capture
kann ein sein, capture-default
das ist:
capture-default:
&
=
Dies bedeutet, dass automatisch erfasst wird, was auch immer ich verwende, nach Referenz ( &
) bzw. nach Wert ( =
) - die Behandlung von this
ist jedoch etwas Besonderes - in beiden Fällen wird es aus den zuvor angegebenen Gründen nach Wert erfasst (auch bei einer Standarderfassung von)&
, was normalerweise bedeutet Erfassung durch Referenz).
5.1.2.7/8:
Zum Zwecke der Namenssuche (3.4), Bestimmen des Typs und Werts von this
(9.3.2) und Transformieren von ID-Ausdrücken, die sich auf nicht statische Klassenmitglieder beziehen, in Klassenausdrücke für den Zugriff von (*this)
Klassenmitgliedern unter Verwendung von (9.3.1), der zusammengesetzten Anweisung [OF THE LAMBDA] wird im Kontext des Lambda-Ausdrucks betrachtet.
Das Lambda verhält sich also so, als ob es Teil der einschließenden Elementfunktion ist, wenn Elementnamen verwendet werden (wie in Ihrem Beispiel die Verwendung des Namens x
), und generiert daher "implizite Verwendungen" this
wie bei einer Elementfunktion.
Wenn eine Lambda-Erfassung einen Erfassungsstandard enthält &
, dürfen den Bezeichnern in der Lambda-Erfassung keine vorangestellten Bezeichner vorangestellt werden &
. Wenn eine Lambda-Erfassung einen Erfassungsstandard enthält, darf =
die Lambda-Erfassung nicht enthalten sein, this
und jeder darin enthaltenen
Kennung muss vorangestellt werden &
. Eine Kennung oder this
darf in einer Lambda-Erfassung nicht mehr als einmal vorkommen.
So Sie verwenden können [this]
, [&]
, [=]
oder [&,this]
als lambda-introducer
das erfassen this
Zeiger nach Wert.
Jedoch [&this]
und [=, this]
sind schlecht geformt. Im letzten Fall gcc warnt forgivingly für [=,this]
die explicit by-copy capture of ‘this’ redundant with by-copy capture default
eher als Fehler.
this
Kann nicht geändert werden, ist nicht groß genug, um einen Verweis schneller zu machen ... und trotzdem existiert er nicht wirklich , also hat er Keine wirkliche Lebensdauer, was bedeutet, dass ein Hinweis darauf per Definition baumeln würde.this
ist ein Wert, kein Wert.