Heim > Backend-Entwicklung > C++ > Wann ist das Schlüsselwort „veränderlich' in C 11 Lambda Capture-by-Value erforderlich?

Wann ist das Schlüsselwort „veränderlich' in C 11 Lambda Capture-by-Value erforderlich?

DDD
Freigeben: 2024-11-29 04:22:13
Original
685 Leute haben es durchsucht

When is the `mutable` Keyword Necessary in C  11 Lambda Capture-by-Value?

Eintauchen in C 11 Lambda Capture-by-Value: Die Notwendigkeit eines „veränderlichen“ Schlüsselworts aufdecken

In C 11 stellen Lambda-Ausdrücke bereit ein leistungsstarker Mechanismus zum Erstellen anonymer Funktionsobjekte. Bei der Erfassung nach Wert taucht jedoch häufig das berüchtigte Schlüsselwort „veränderlich“ auf, sodass sich Entwickler über seinen Zweck wundern.

Bedenken Sie den folgenden Ausschnitt:

#include <iostream>

int main() {
    int n;
    [&amp;](){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 das Schlüsselwort „veränderlich“. Beim zweiten Lambda meldet der Compiler einen Fehler. Es stellt sich die Frage: Warum ist dieses Schlüsselwort notwendig?

Der implizite Vertrag von Funktionsobjekten

Lambda-Ausdrücke sind Instanzen von Funktionsobjekten. Von Funktionsobjekten wird erwartet, dass sie dem Grundprinzip der funktionalen Programmierung entsprechen: referenzielle Transparenz. Dies bedeutet, dass das Ergebnis bei einem Aufruf mit denselben Argumenten immer dasselbe sein sollte.

Beim Erfassen nach Wert erstellt der Lambda-Ausdruck eine lokale Kopie der Variablen. Dies stellt jedoch ein potenzielles Problem dar. Wenn das Lambda die Kopie ändert, kann sich der Wert der Originalvariablen ändern, was gegen das Prinzip der referenziellen Transparenz verstößt.

Referenzialität mit „Mutable“ erzwingen

Das Schlüsselwort „mutable“. bricht diesen impliziten Vertrag. Durch die Angabe ermöglicht der Compiler, dass der Lambda-Ausdruck den erfassten Wert ändert. Dies gewährt dem Entwickler explizite Kontrolle über die Veränderlichkeit und Nebenwirkungen des Lambda.

Ohne „veränderlich“ erzwingt der Compiler referenzielle Transparenz, indem er verhindert, dass das Lambda erfasste Werte ändert. Dadurch wird sichergestellt, dass das Lambda für einen bestimmten Satz von Argumenten immer das gleiche Ergebnis zurückgibt, was es zu einem echten Funktionsobjekt macht.

Ein Gleichgewicht finden

Das Schlüsselwort „mutable“. Bietet ein notwendiges Gleichgewicht zwischen referenzieller Transparenz und der Flexibilität, erfasste Werte zu ändern. Es ermöglicht dem Entwickler zu wählen, ob das Lambda die Außenwelt beeinflussen kann oder nicht.

Daher ist das Schlüsselwort „veränderlich“ in Capture-by-Value-Lambdas nicht nur eine Konvention, sondern eine entscheidende Schutzmaßnahme, die das bewahrt grundlegende Natur von Funktionsobjekten: zuverlässiges und vorhersehbares Verhalten.

Das obige ist der detaillierte Inhalt vonWann ist das Schlüsselwort „veränderlich' in C 11 Lambda Capture-by-Value 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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage