Heim >Backend-Entwicklung >C++ >Warum ist das Schlüsselwort „mutable' zum Ändern erfasster Variablen in C 11-Lambdas erforderlich?
Verstehen der Notwendigkeit von „Veränderlichkeit“ in C 11 Lambda Capture-by-Value
Lambda-Ausdrücke in C 11 bieten zwei Erfassungsmodi: Capture-by-Reference und Capture-by-Value. Beim Erfassen von Variablen nach Wert kann das Lambda diese ändern. Dieses Verhalten ist jedoch nicht automatisch. Das Schlüsselwort „mutable“ ist erforderlich, um Änderungen zu ermöglichen.
Begründung hinter der „Mutable“-Anforderung
Ein wesentlicher Unterschied zwischen Lambdas und traditionellen benannten Funktionen besteht darin, dass Lambdas entworfen werden um eine Reihe von Operationen zu kapseln, die in einem lokalen, temporären Zustand ausgeführt werden. Standardmäßig sollte dieser Zustand während der gesamten Lambda-Ausführung konstant bleiben.
Wenn Lambdas die Änderung von Capture-by-Value-Variablen ohne „Variable“ erlauben, würden sie gegen das Prinzip des Funktionsdeterminismus verstoßen. Ein Lambda sollte bei jedem Aufruf dieselbe Ausgabe erzeugen, unabhängig vom Status des umgebenden Codes. Das Ändern von Capture-by-Value-Variablen führt zu Nichtdeterminismus, wodurch das Verhalten des Lambda schwer vorherzusagen ist.
Capture-by-Value verstehen
Capture-by-Value ist Entwickelt, um eine lokale Kopie der erfassten Variablen zu erstellen. Diese Kopie soll unveränderlich sein, um sicherzustellen, dass das Verhalten des Lambda konsistent bleibt. Es kann jedoch Situationen geben, in denen das Lambda die Kopie der erfassten Variablen ändern muss.
Betrachten Sie beispielsweise den folgenden Code:
int main() { int n; [&](){n = 10;}(); // OK [=]() mutable {n = 20;}(); // OK // [=](){n = 10;}(); // Error: a by-value capture cannot be modified in a non-mutable lambda std::cout << n << "\n"; // "10" }
Ohne „veränderlich“ erfasst das Lambda -by-value kann die Kopie von „n“ nicht ändern. Dadurch wird sichergestellt, dass die Ausgabe konsistent bleibt, auch wenn die Ausführung des Lambda die ursprüngliche Variable „n“ ändert.
Durch die Verwendung von „veränderlich“ geben wir explizit an, dass das Lambda die erfasste Kopie ändern darf. Dadurch können wir die Kopie von „n“ im Lambda ändern, ohne das Verhalten der einschließenden Funktion zu beeinflussen.
Das obige ist der detaillierte Inhalt vonWarum ist das Schlüsselwort „mutable' zum Ändern erfasster Variablen in C 11-Lambdas erforderlich?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!