Heim  >  Artikel  >  Backend-Entwicklung  >  Garantiert die Erfassung einer Referenz durch Referenz in C 11 Lambdas den Zugriff auf den geänderten Wert?

Garantiert die Erfassung einer Referenz durch Referenz in C 11 Lambdas den Zugriff auf den geänderten Wert?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-03 22:39:03376Durchsuche

Does Capturing a Reference by Reference in C  11 Lambdas Guarantee Access to the Modified Value?

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

  • „Geltungsbereich“ in C bezieht sich auf einen statischen, lexikalischen Codebereich, in dem die unqualifizierte Namenssuche einen Namen mit einer Deklaration verknüpft. Es hat keinen direkten Bezug zur Lebensdauer.
  • Regeln zum Erreichen des Gültigkeitsbereichs für Lambdas bestimmen, wann die Erfassung zulässig ist, basierend auf syntaktischen Regeln, nicht auf der Lebensdauer.

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!

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