Ok, ci sono tre categorie di espressioni :
- quelli che rappresentano oggetti che hanno un'identità e non possono essere spostati da;
- quelli che rappresentano oggetti che hanno un'identità e possono essere spostati da;
- quelli che rappresentano oggetti che non hanno un'identità e possono essere spostati da;
I primi sono detti lvalue, i secondi sono xvalue e i terzi sono prvali. Se mettiamo insieme lvalue e xvalue, abbiamo glvalues. Gli glalei sono tutte espressioni che rappresentano oggetti con un'identità. Se mettiamo insieme xvalue e prvalue abbiamo rvalues. I rvalues sono tutte espressioni che rappresentano oggetti che possono essere spostati.
L'espressione in questione, x
, è un glivalue: si può scrivere &x
, quindi l'oggetto ha chiaramente un'identità.
Possiamo passare da questa espressione? Questo oggetto sta per scadere? No non lo è. Scade solo qualche tempo dopo l'espressione corrente. Ciò significa che non può essere spostato da. Questo lo rende un lvalue.
Tutti questi nomi possono essere un po 'confusi perché lvalue e rvalue in C++ non significano più ciò che intendevano nelle loro origini C. Il significato di C++ non è completamente correlato all'essere sul lato sinistro o destro dell'assegnazione .
Personalmente, preferisco usare la terminologia da this paper di Bjarne: iM-values (invece di lvalue), im-values (invece di xvalues), Im-values (invece di prvalues), i-values (invece di glvalues) e valori m (invece di rvalue). Questa non è la terminologia utilizzata dallo standard, purtroppo.
qui "hanno un'identità" significa "il suo indirizzo può essere presa"; "può essere spostato da" significa che sta per scadere, a causa della sua natura temporanea, o perché il programmatore lo ha reso esplicito nel sistema di tipi chiamando std::move
o qualcosa di simile.
Si può avere rvalues sul lato sinistro di assegnazione: std::vector<int>(17) = std::vector<int>(42)
è un'espressione valida, anche se è inutile.
fonte
2012-12-05 13:58:59
@Kimi anche se breve il tuo commento è la risposta corretta. –
Questo è vero, tuttavia vorrei ipotizzare che per coloro che non sanno quali lvalue e rvalue "siano" in C++ 11, questa risposta potrebbe essere più utile. –
Non sono sicuro di come il mio commento è stato spostato qui, ma quando ho detto "questo è vero" ciò a cui mi riferivo era una risposta cancellata che affermava "Constant ha un nome quindi è un lvalue" –