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.
Danke. Dies beantwortet meine Frage und jede weitere Frage, die ich gehabt hätte. – Klam
@Klam: Alles Teil des Service hier bei Lightness Industries. –