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" }
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!