Lambda-Erfassung und -Konstanz in C 0x
Bei der Arbeit mit Lambda-Ausdrücken in C 0x stellt sich häufig die Frage: Gibt es eine Möglichkeit zur Erfassung? nach Wert erfassen und gleichzeitig verhindern, dass der erfasste Wert konstant gemacht wird?
Der C-Sprachstandard legt fest, dass Lambda-Ausdrücke, die Variablen nach Wert erfassen, dies auf konstante Weise tun. Dies bedeutet, dass der erfasste Wert nicht innerhalb des Lambda geändert werden kann. In bestimmten Szenarien kann es jedoch erforderlich sein, eine Variable nach Wert zu erfassen, aber dennoch ihren Wert zu ändern.
Stellen Sie sich beispielsweise einen Bibliotheksfunktor mit einer nicht konstanten Methode „operator()“ vor, die wir erfassen möchten Rufen Sie ein Lambda an. Der folgende Code lässt sich nicht kompilieren:
<code class="cpp">struct foo { bool operator () ( const bool & a ) { return a; } }; int main() { foo afoo; auto bar = [=] () -> bool { afoo(true); }; return 0; }</code>
Der Fehler besteht darin, dass der Operator() des Lambda-Ausdrucks aufgrund der umgebenden [=]-Erfassungsliste als const deklariert ist. Um dies zu beheben, können wir das Schlüsselwort mutable verwenden. Durch das Hinzufügen von veränderbar zur Lambda-Erfassungsliste ermöglichen wir dem Lambda, erfasste Variablen zu ändern, auch solche, die durch einen Wert erfasst werden:
<code class="cpp">auto bar = [=] () mutable -> bool { afoo(true); };</code>
Diese Änderung macht den Operator() des Lambda nicht konstant, sodass wir die Nicht-Variablen aufrufen können -const-Operator() des Afoo-Objekts.
Um daher in einem Lambda-Ausdruck nach Wert zu erfassen und zu verhindern, dass der erfasste Wert konstant ist, verwenden Sie das Schlüsselwort veränderbar in der Erfassungsliste. Dadurch kann das Lambda die erfasste Variable ändern, ohne Kompilierungsfehler zu verursachen.
Das obige ist der detaillierte Inhalt vonWie erfasst man erfasste Variablen nach Wert und ändert sie in C-Lambda-Ausdrücken?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!