Heim > Artikel > Backend-Entwicklung > Garantiert die Erfassung einer Referenz durch Referenz in C 11 Lambdas den Zugriff auf den geänderten Wert?
Erfassen einer Referenz durch Referenz in C 11 Lambdas
Die Frage:
Bedenken Sie die Folgender Codeausschnitt:
<code class="cpp">#include <functional> #include <iostream> std::function<void()> make_function(int& x) { return [&]{ std::cout << x << std::endl; }; } int main() { int i = 3; auto f = make_function(i); i = 5; f(); }</code>
Können wir garantieren, dass dieses Programm 5 ausgibt, ohne auf undefiniertes Verhalten zu stoßen? Diese Frage stellt sich insbesondere beim Erfassen der Variablen x durch Referenz ([&]) und betrifft die Frage, ob die Erfassung einer Referenz auf eine Variable zu einer freien Referenz führt, sobald die Funktion make_function zurückkehrt.
Die Antwort :
Ja, der Code funktioniert garantiert.
Erklärung:
Die C 11 Lambda-Spezifikation besagt, dass die hier erfasste Referenz gültig bleibt, solange das ursprünglich referenzierte Objekt noch existiert. Dies bedeutet, dass, auch wenn der Parameter x in make_function nach der Rückkehr der Funktion den Gültigkeitsbereich verlässt, der Lambda-Abschluss immer noch einen gültigen Verweis auf die Ganzzahl i beibehält.
Klarstellung:
Um einige Ungenauigkeiten in früheren Antworten zu beheben:
In diesem speziellen Fall die Variable x liegt im Reichweitenbereich des Lambda und wird per Referenz erfasst. Daher bleibt die Referenz gültig und das Lambda kann weiterhin auf den geänderten Wert von i zugreifen.
Schlussfolgerung:
Dieser Code demonstriert die korrekte Erfassung einer Referenz durch Referenz in einem Lambda. Es wird garantiert 5 ausgegeben, ohne undefiniertes Verhalten hervorzurufen.
Das obige ist der detaillierte Inhalt vonGarantiert die Erfassung einer Referenz durch Referenz in C 11 Lambdas den Zugriff auf den geänderten Wert?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!