Überprüfen Sie die Funktion foo und wie das statische Lambda k durch Referenz erfasst. Dies scheint zu funktionieren, und das Gleiche passiert mit komplizierteren Datentypen als int .
Wird das erwartet? Gibt es eine Garantie, dass die Adresse von k für jeden Aufruf von foo identisch ist, oder ist dies UB ?
?Vielen Dank im Voraus und Entschuldigung, wenn dies zuvor beantwortet wurde (Ich habe versucht, eine ähnliche Frage ohne Erfolg zu finden)
Es ist ein undefiniertes Verhalten .
Nach Paragraph 5.2.2 / 4 des C ++ 11 Standards über Funktionsaufrufausdrücke und die Initialisierung ihrer Parameter:
[...] Die Lebensdauer eines Parameters endet mit der Funktion, in der er steht ist definiert als Rückgabe . Die Initialisierung und Zerstörung jedes Parameters erfolgt im Kontext des Anruffunktion. [...]
Daher wird Ihr Lambda eine Referenz speichern, die gerade schwankt, sobald der Funktionsaufruf zurückkehrt.
In diesem Fall sind Implementierungen frei (und wahrscheinlich), um Funktionsparameter für jeden Funktionsaufruf an derselben Adresse zu erstellen, was wahrscheinlich der Grund ist, warum Sie die erwartete Ausgabe beobachten.
Dieses Verhalten ist jedoch vom Standard nicht vorgeschrieben - daher sollten Sie sich nicht darauf verlassen (wenn dies der Fall wäre, wäre Ihr Code legal wegen 3.8 / 7).
Der Grund, warum es in Ihrem Beispiel wahrscheinlich "funktioniert", ist, dass der Call-Stack immer gleich aufgereiht ist. Versuchen Sie es stattdessen und sehen Sie, ob Sie immer noch die "erwartete" Ausgabe erhalten.
%Vor%