2015-10-12 11 views
6

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.

risposta

4

Un temporaneo viene costruito, inizializzato dal valore del letterale e dura fino a quando il riferimento. Puoi fare ciò che ti piace con questo oggetto.

In termini di durata, questo è lo stesso come se avessi scritto const int& x = 5; solo, lì, il fatto che tu stia lavorando con un oggetto temporaneo creato automaticamente è mascherato perché lo const ti impedisce di provarlo con una mutazione.

[C++14: 8.5.3/5]:[..] Se T1 è un tipo non-classe, una temporanea di tipo “CV1T1” viene creato e copia-inizializzato (8.5) dall'espressione inizializzatore. Il riferimento è quindi legato al temporaneo. [..]

+1

Grazie. Questo risponde alla mia domanda e ad ogni domanda successiva che avrei avuto. – Klam

+0

@Klam: tutta la parte del servizio qui a Lightness Industries. –

5
int&& xref = 5; 

... crea una temporanea, inizializzato con 5, la cui vita viene prorogato fino alla fine del blocco.

L'assegnazione

xref = 10; 

cambia il valore della temporanea ancora in vita.

Problemi correlati