Heim > Backend-Entwicklung > C++ > Warum ist das Schlüsselwort „mutable' zum Ändern erfasster Variablen in C 11-Lambdas erforderlich?

Warum ist das Schlüsselwort „mutable' zum Ändern erfasster Variablen in C 11-Lambdas erforderlich?

Barbara Streisand
Freigeben: 2024-11-28 11:10:14
Original
743 Leute haben es durchsucht

Why Is the `mutable` Keyword Necessary for Modifying Captured Variables in C  11 Lambdas?

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"
}
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage