2015-10-12 11 views
6

Dies ist zugegebenermaßen eine pingelige Frage, die hauptsächlich von Neugier getrieben wird. Angenommen, wir haben die folgenden:Was passiert, wenn Sie einer rvalue-Referenz eine Literalkonstante zuweisen?

int x = 5; 
int&& xref = std::move(x); 
std::cout << "Before assignment x: " << x << std::endl; 
std::cout << "Before assignment xref: " << xref << std::endl; 
xref = 10; 
std::cout << "After assignment x: " << x << std::endl; 
std::cout << "After assignment xref: " << xref << std::endl; 

Der Ausgang ist wie erwartet:

// Before assignment x: 5 
// Before assignment xref: 5 
// After assignment x: 10 
// After assignment xref: 10 

Das macht Sinn. std::move konvertiert x in einen xvalue und ermöglicht es uns, seinen Speicherort an xref zu binden und seinen Inhalt entsprechend zu ändern. Jetzt können sagen, wir haben die folgenden:

int&& xref = 5; 
std::cout << "Before assignment xref: " << xref << std::endl; 
xref = 10; 
std::cout << "After assignment xref: " << xref << std::endl; 

int x = 5; 
std::cout << "After assignment x: " << x << std::endl; 

Der Ausgang intuitiv ist:

// Before assignment xref: 5 
// After assignment xref: 10 
// After assignment x: 5 

Diese Gesamt Sinn machen. Wir erwarten, in der Lage zu sein, das konstante Literal 5 an xref zu binden, weil 5 ein prvalue ist. Wir erwarten auch, dass xref änderbar sein wird. Wir erwarten ferner, dass der Wert des konstanten Literals 5 nicht änderbar ist (wie in den letzten beiden Zeilen des obigen Ausschnitts etwas pedantisch dargestellt).

Also meine Frage ist, was genau hier vor sich geht? Wie kann C++ den Wert des Konstantenliterals 5 nicht ändern und dennoch eine ausreichende Identität für xref erhalten, um zu wissen, dass es durch die Zuweisung in 10 geändert wurde. Wird eine neue Variable bei der Zuweisung an xref erstellt, wenn sie an ein konstantes Literal gebunden ist? Diese Frage tauchte in C++ 03 nie auf, da nur konstante Referenzen an R-Werte gebunden werden konnten.

Antwort

4

Ein temporäres Konstrukt wird aus dem Wert des Literals initialisiert und dauert so lange wie die Referenz. Sie können mit diesem Objekt machen, was Sie wollen.

In Bezug auf die Lebensdauer ist dies genau so, als ob Sie const int& x = 5 geschrieben hätten; Nur dort wird die Tatsache, dass Sie mit einem automatisch erstellten temporären Objekt arbeiten, maskiert, weil Sie durch das const nicht daran gehindert werden, es mit einer Mutation zu beweisen.

[C++14: 8.5.3/5]:[..] Wenn T1 ist ein nicht-Klasse-Typ, eine temporäre vom Typ „cv1T1“ erstellt wird und kopier initialisiert (8.5) aus dem initializer Ausdruck. Die Referenz ist dann an das Temporäre gebunden. [..]

+1

Danke. Dies beantwortet meine Frage und jede weitere Frage, die ich gehabt hätte. – Klam

+0

@Klam: Alles Teil des Service hier bei Lightness Industries. –

5
int&& xref = 5; 

... erstellt eine temporäre, mit 5 initialisiert, deren Lebensdauer bis zum Ende des Blocks erstreckt.

Die Zuordnung

xref = 10; 

ändert den Wert der noch vorübergehend leben.

Verwandte Themen