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>
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!