Heim > Backend-Entwicklung > C++ > Hauptteil

Ist bei der Erfassung einer Referenz durch Referenz in C 11-Lambdas garantiert, dass der aktualisierte Wert ausgegeben wird?

Patricia Arquette
Freigeben: 2024-11-04 20:50:02
Original
388 Leute haben es durchsucht

Is Capturing a Reference by Reference in C  11 Lambdas Guaranteed to Output the Updated Value?

Erfassen von Referenzen durch Referenz in C 11-Lambdas

Dieses Codefragment demonstriert die Erfassung einer ganzzahligen Referenz durch Referenz innerhalb eines Lambda-Ausdrucks:

<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>
Nach dem Login kopieren

Ist dieser Code garantiert, dass er 5 ausgibt, ohne undefiniertes Verhalten hervorzurufen?

Es ist tatsächlich garantiert, dass der Code funktioniert, ohne undefiniertes Verhalten hervorzurufen. Im Gegensatz zur Erfassung nach Wert ([= x]) nutzt die Erfassung nach Referenz ([&x]) eine einzigartige Ausnahme innerhalb des C-Standards, die es ermöglicht, dass Referenzen außerhalb ihrer Lebensdauer bestehen bleiben. Dies liegt daran, dass von Lambda-Ausdrücken erfasste Referenzen als Mitgliedszugriff auf den Lambda-Abschlusstyp implementiert werden.

Überlegungen zum Umfang und zur Lebensdauer

Es ist wichtig zu beachten, dass der erreichbare Bereich gilt denn Lambdas sind rein syntaktisch und spielen in diesem Szenario keine Rolle. Die referenzierte Entität x liegt im Reichweitenbereich des Lambda und kann erfasst werden.

Standardformulierung

Gemäß [expr.prim.lambda]/17 Gemäß dem C-Standard werden nur durch Kopieren erfasste Ausdrücke in Memberzugriff auf den Lambda-Abschlusstyp umgewandelt. Durch Referenz erfasste Ausdrücke bleiben einfach unverändert und bezeichnen weiterhin die ursprüngliche Entität.

Darüber hinaus geht der Standard nicht explizit auf das Problem der Verwendung von Referenzen außerhalb ihrer Lebensdauer ein. Da es jedoch keine Strafe für die Verwendung einer Referenz außerhalb ihrer Lebensdauer gibt (es sei denn, sie wird von ihrem eigenen Initialisierer oder einem vorhergehenden Klassenmitglied referenziert), kann dieser Code wie vorgesehen funktionieren.

Schlussfolgerung

Das Erfassen einer Referenz durch Referenz in einem C 11-Lambda funktioniert garantiert wie erwartet und gibt den aktualisierten Wert der referenzierten Ganzzahl aus, ohne undefiniertes Verhalten hervorzurufen. Dies basiert auf der Standarddefinition der Lambda-Erfassung und dem festgestellten Fehlen von Strafen für die Verwendung von Referenzen außerhalb ihrer Lebensdauer in bestimmten spezifischen Kontexten.

Das obige ist der detaillierte Inhalt vonIst bei der Erfassung einer Referenz durch Referenz in C 11-Lambdas garantiert, dass der aktualisierte Wert ausgegeben wird?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage