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

Warum ist das Schlüsselwort „veränderlich' für Capture-by-Value in C 11-Lambdas erforderlich?

Mary-Kate Olsen
Freigeben: 2024-12-07 00:04:11
Original
1008 Leute haben es durchsucht

Why is the `mutable` Keyword Necessary for Capture-by-Value in C  11 Lambdas?

Untersuchung der C 11-Lambda-Anforderung für „veränderlich“ bei Capture-by-Value

In C 11 sind nach Wert erfasste Lambdas funktional unveränderlich, was bedeutet, dass sie die nicht ändern können erfasste Werte standardmäßig. Um dieses Verhalten zu ändern, wird das Schlüsselwort „mutable“ verwendet, um Änderungen innerhalb des Lambda-Bereichs zu ermöglichen.

Betrachten Sie das folgende Beispiel:

int main() {
    int n;
    [&]() { n = 10; }(); // OK, captures by reference

    [=]() mutable { n = 20; }(); // OK, captures by value with "mutable"

    // [=](){n = 10;}(); // Error, cannot modify by-value capture without "mutable"

    std::cout << n << "\n"; // Prints "10"
}
Nach dem Login kopieren

Es stellt sich die Frage: Warum ist das Schlüsselwort „mutable“ Schlüsselwort für Capture-by-Value erforderlich?

Traditionell sind an benannte Funktionen übergebene Parameter implizit veränderbar, was Änderungen innerhalb der Funktion ermöglicht Funktion. Lambdas bieten jedoch sowohl Capture-by-Reference- als auch Capture-by-Value-Mechanismen, die ein unterschiedliches Verhalten einführen.

Standardmäßig erstellt Capture-by-Value eine Kopie der externen Variablen, und das Lambda kann nur eine Kopie der externen Variablen erstellen auf diesem temporären Wert arbeiten. Ohne „mutable“ führt jeder Versuch, den erfassten Wert zu ändern, zu einem Compilerfehler, da dies gegen das Prinzip der Unveränderlichkeit für Funktionsobjekte verstößt.

Daher wird das Schlüsselwort „mutable“ eingeführt, um Änderungen darin explizit zu ermöglichen ein Lambda, das nach Wert erfasst. Es signalisiert dem Compiler, dass die erfasste Kopie als veränderbar behandelt werden kann, und kehrt so zu einem traditionelleren funktionsähnlichen Verhalten zurück.

Zusammenfassend ist das Schlüsselwort „mutable“ für die Erfassung nach Wert in C erforderlich 11 Lambdas, weil dadurch sichergestellt wird, dass die Ausgabe des Funktionsobjekts mit seinen Eingaben konsistent bleibt, während gleichzeitig Änderungen an der erfassten Kopie innerhalb des Lambda-Bereichs möglich sind.

Das obige ist der detaillierte Inhalt vonWarum ist das Schlüsselwort „veränderlich' für Capture-by-Value 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