9

Aktualisierung der Frage Why this two rvalue references examples have different behavior?:Kann ich Rvalue-Referenz zu temporär verwenden? Ist es undefiniertes Verhalten oder nicht?

Quellcode:

int a = 0; 
auto && b = a++; 
++a; 
cout << a << b << endl; 

druckt 20

Ist es nicht definiertes Verhalten (UB) b nach dem a++ Aufruf zu benutzen? Vielleicht können wir b nicht verwenden, weil es sich auf ein temporäres bezieht?

+2

Dieses Dokument nützlich sein könnte Sie: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/1993/N0345.pdf – dkg

+1

Hmm, von meinem Verständnis her ist es nicht so, wie der Wert des temporären von 'a ++' "verschoben" wird "zu" b ". Aber ich denke, es könnte UB sein, wenn Sie 'auto && b = ++ a;' verwenden würden, wie in Ihrem Beispiel in der anderen Frage. Aber ich kann völlig falsch liegen, da ich mit der Bewegungssemantik nicht wirklich vertraut bin. –

+0

@ dkg Ist es tatsächlich für Verweise auf Rvalues ​​in C++ 11 ('&&') eingeführt? – vladon

Antwort

5

Nein, es ist kein undefiniertes Verhalten (UB). Es ist in Ordnung - Sie können den Inhalt des temporären hier ändern (solange der Verweis für die Lebensdauer des temporären gültig ist, in diesem Fall verlängert die Bindung an den Rvalue-Verweis diese Lebensdauer des Rvalue auf die Lebensdauer des Verweises).

Eine allgemeinere Frage ist; ist es UB, ein temporäres durch die Rvalue-Referenz zu ändern? Nein, es ist nicht UB. Bewegungssemantik, bei der das Objekt "move-to" den Inhalt des Objekts "move-from" "stiehlt", ist darauf angewiesen, dass es gut definiert ist.

+0

Wie wäre es mit 'auto && b = ++ a;'? Ist es sicher, 'a' nach dieser Zuweisung zu verwenden? –

+5

Ja ist es. Das 'auto &&' ist dann keine rvalue-Referenz, die Referenzen kollabieren so, dass b 'int &' ist und bindet normalerweise eine lvalue-Referenz. – Niall

+1

Ah ok, es gibt also keinen impliziten Wechsel von 'a' nach' b' !? Vielen Dank –

12

Der Code ist in Ordnung. b bezieht sich auf ein Objekt mit verlängerter Lebensdauer, das das Ergebnis des Ausdrucks a++ ist, der ein anderes Objekt als a ist. (Durch das Binden eines temporären Objekts an eine Referenz wird die Lebensdauer des Objekts auf die der Referenz verlängert.) Sie können beide Objekte verwenden und ändern.

3

Die Bezugnahme auf ein Temporäres verlängert seine Lebensdauer auf das Ende der Lebensdauer dieses Verweises.

ISO/IEC 14882 § 12.2/5:

Der zweite Kontext ist, wenn eine Referenz auf ein temporäres gebunden ist. Die vorübergehend, auf denen die Referenz gebunden oder die temporäre, dass die vollständige Aufgabe eines Subobjekt ist, an dem die Referenz gebunden ist für die gesamte Lebensdauer der Referenz bleibt [...]

Verwandte Themen