Heim  >  Artikel  >  Backend-Entwicklung  >  Ist das Erfassen einer Referenz durch Referenz in einem C 11 Lambda sicher?

Ist das Erfassen einer Referenz durch Referenz in einem C 11 Lambda sicher?

Patricia Arquette
Patricia ArquetteOriginal
2024-11-04 03:50:02273Durchsuche

 Is Capturing a Reference by Reference in a C  11 Lambda Safe?

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&amp; x) {
    return [&amp;]{ 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!

Stellungnahme:
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