Referenz, die in der statischen Variablendefinition erfasst wurde

8
%Vor%

Ü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)

    
José Manuel 17.04.2013, 22:12
quelle

2 Antworten

4

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).

    
Andy Prowl 17.04.2013, 22:18
quelle
1

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%     
Timothy Shields 17.04.2013 22:24
quelle

Tags und Links