Der Grund [&this]dafür ist, dass es sich um einen Syntaxfehler handelt. Jeder durch Kommas getrennte Parameter in lambda-introducerist ein capture:
capture:
identifier
& identifier
this
Sie können sehen, dass &thisdies syntaktisch nicht zulässig ist. Der Grund, warum dies nicht zulässig ist, liegt darin, dass Sie niemals thisals 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 thisexplizit zu erfassen , können Sie [this]als verwenden lambda-introducer.
Das erste capturekann ein sein, capture-defaultdas ist:
capture-default:
&
=
Dies bedeutet, dass automatisch erfasst wird, was auch immer ich verwende, nach Referenz ( &) bzw. nach Wert ( =) - die Behandlung von thisist 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" thiswie 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, thisund jeder darin enthaltenen
Kennung muss vorangestellt werden &. Eine Kennung oder thisdarf in einer Lambda-Erfassung nicht mehr als einmal vorkommen.
So Sie verwenden können [this], [&], [=]oder [&,this]als lambda-introducerdas erfassen thisZeiger 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 defaulteher als Fehler.
thisKann 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.thisist ein Wert, kein Wert.