Erfassen einer Referenz durch Referenz in einem C 11-Lambda
In C 11 verwenden wir häufig Lambdas, um Variablen aus dem umgebenden Kontext zu erfassen. Aber was passiert, wenn wir eine Referenz durch Referenz erfassen? Ist das sicher?
Problemdetails
Bedenken Sie den folgenden Code:
<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>
In diesem Code haben wir ein Lambda, das erfasst einen Verweis auf die Ganzzahlvariable i. Anschließend modifizieren wir i in der Hauptfunktion und rufen das Lambda auf. Die Frage ist, wird das Lambda 3 oder 5 ausgeben?
Standardbasierte Antwort
Der Code gibt garantiert 5 aus, ohne undefiniertes Verhalten hervorzurufen.
Erklärung
Gemäß dem C 11-Standard ([expr.prim.lambda]/17) werden nur ID-Ausdrücke, die sich auf durch Kopieren erfasste Entitäten beziehen, in einen Mitgliedszugriff umgewandelt auf dem Lambda-Verschlusstyp. Id-Ausdrücke, die sich auf durch Referenz erfasste Entitäten beziehen, werden in Ruhe gelassen und bezeichnen immer noch dieselbe Entität, die sie im umschließenden Bereich bezeichnet hätten.
Das bedeutet, dass die Referenz x im Lambda nicht geändert wird. Es bezieht sich immer noch auf dieselbe ganzzahlige Variable i in der Hauptfunktion. Wenn wir i in der Hauptfunktion ändern, sieht das Lambda daher weiterhin den geänderten Wert.
Das obige ist der detaillierte Inhalt vonIst das Erfassen einer Referenz durch Referenz in einem C 11 Lambda sicher?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!