Referenzen in c 11 lambdas
In C können Lambda -Ausdrücke Variablen aus ihrem umschließenden Bereich erfassen. Auf die Erfassungsmethode bestimmt jedoch, ob die Variable durch Referenz oder Wert zugegriffen wird. Betrachten Sie den folgenden Code:
#include
#include
std::function make_function(int& x) {
return [&]{ std::cout Dieser Code erfasst die Variable X durch Referenz mit der [&] Syntax. Es stellt sich die Frage, ob dieses Programm garantiert, dass er 5 ausgeben kann, ohne undefinedes Verhalten aufzurufen.
Antwort: Ja
Der Code funktioniert garantiert richtig. Vor der Prüfung des zugrunde liegenden Standard -Wortlauts ist es wichtig zu beachten, dass dieser Code wie vom C -Komitee beabsichtigt funktioniert. Der anfängliche Wortlaut des C 11 -Standards war in dieser Angelegenheit jedoch unklar, was dazu führte, dass CWG -Ausgabe 2011 zur Klärung vorgenommen wurde. Dieses Problem wird in der laufenden Entwicklung des C-Standards behandelt.
Standard Erklärung
nach [exprim.prim.lambda]/17 des C-Standards werden nur ID-Expressionen, die von Kopien erfasst werden, in einen Member-Zugriff auf den Griffs-Griffs-Typ verwandelt. ID-Expressionen, die sich auf Entitäten beziehen, die durch Referenz erfasst wurden, werden allein gelassen und bezeichnen weiterhin dieselbe Entität, die sie im umschließenden Bereich bezeichnet hätten. Daher bezieht sich der Referenz X im Lambda -Ausdruck auf die in der Hauptfunktion deklarierte ursprüngliche Variable.
Es kann anfangs problematisch erscheinen, dass X nach der Rückgabe der Make_Function -Funktion außerhalb seiner Lebensdauer referenziert wird. Es gibt jedoch nur begrenzte Szenarien, in denen eine Referenz außerhalb ihrer Lebensdauer referenziert werden kann. Im Allgemeinen wird eine Referenz entweder in Geltungsbereich oder ein Klassenmitglied deklariert. In diesem Fall muss die Klasse selbst in ihrer Lebensdauer liegen.
Daher verbietet der Standard die Verwendung von Referenzen außerhalb ihrer Lebensdauer nicht ausdrücklich. Diese Lücke, die die Erfassung von Referenzen durch Referenzen in Lambda -Ausdrücken erfasst werden muss. Die Lösung dieses Problems wirkte sich versehentlich auf die Spezifikation für die Lambda -Erfassung durch Referenzen aus. Es wird jedoch erwartet, dass diese Regression vor der Veröffentlichung von C 17 festgelegt wird.
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3