Questa è certamente una domanda pungente che è principalmente guidata dalla curiosità. Supponiamo di avere il seguente:Cosa succede quando assegni una costante letterale a un riferimento di rvalue?
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;
L'uscita come previsto è:
// Before assignment x: 5
// Before assignment xref: 5
// After assignment x: 10
// After assignment xref: 10
questo ha un senso. std::move
converte x
in un valore x e ci consente di associare la sua posizione di memoria a xref
e modificare i suoi contenuti di conseguenza. Ora supponiamo di avere la seguente:
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;
L'uscita è intuitivo:
// Before assignment xref: 5
// After assignment xref: 10
// After assignment x: 5
Questo senso generale. Ci aspettiamo di essere in grado di legare il costante letterale 5
a xref
perché 5
è un valore di prvalore. Prevediamo inoltre che xref
sia modificabile. Ci aspettiamo inoltre che il valore di costante letterale 5
non sia modificabile (come mostrato un po 'pedanticamente nelle ultime due righe del frammento di cui sopra).
Quindi la mia domanda è, cosa sta succedendo esattamente qui? In che modo C++ sa di non modificare il valore del costante letterale 5
mantenendo tuttavia un'identità sufficiente per xref
per sapere che è stato modificato in 10
dal compito. È stata creata una nuova variabile al momento dell'assegnazione a xref
quando è associata a un valore letterale costante? Questa domanda non è mai arrivata in C++ 03 poiché solo i riferimenti const potevano essere associati a rvalues.
Grazie. Questo risponde alla mia domanda e ad ogni domanda successiva che avrei avuto. – Klam
@Klam: tutta la parte del servizio qui a Lightness Industries. –