rvalues e oggetti temporanei nel FCD
Domanda
Mi ci è voluto un bel po ' di tempo per capire la differenza tra un rvalue e un oggetto temporaneo.Ma ora l'ultima bozza del comitato indicato nella pagina 75:
Un rvalue [...] è un xvalue, un oggetto temporaneo o sotto-oggetto di esso, o un valore che non è associato con un oggetto.
Io non posso credere ai miei occhi.Questo deve essere un errore, giusto?
Per chiarire, qui è come ho capito i termini:
#include <string>
void foo(std::string&& str)
{
std::cout << str << std::endl;
}
int main()
{
foo(std::string("hello"));
}
In questo programma, ci sono due espressioni che indicano il medesimo oggetto temporaneo:il prvalue std::string("hello")
e il lvalue str
.Le espressioni non sono oggetti, ma la loro valutazione potrebbe cedere uno.In particolare, la valutazione di un prvalue produce un oggetto temporaneo, ma un prvalue NON È un oggetto temporaneo.Qualcuno d'accordo con me o sono io impazzito?:)
Soluzione
Si, sono d'accordo con te. Questo dovrebbe essere fissato a mio parere, e diverse persone sono profondamente rispetto retribuzione di aver aumentato la stessa identica domanda su questo.
Altri suggerimenti
Questo non è così complicato come sembra.Mi riferisco alle finalizzato standard ISO/IEC 14882-2011.Pagina 78 dice:
Un xvalue (una “scadenza” valore), inoltre, si riferisce a un oggetto, di solito vicino alla fine del suo ciclo di vita (in modo che le sue risorse possono essere spostati, per esempio). Un xvalue è il risultato di alcuni tipi di espressioni che coinvolgono riferimenti rvalue (8.3.2).
Il grassetto è stato aggiunto da me.Lo standard dice:
Un rvalue (così chiamato, storicamente, perché rvalues possono apparire sul il lato destro di un'espressione di assegnazione) è un xvalue, un oggetto temporaneo (12.2) o secondario di esso, o un valore che non è associato ad un oggetto.
Così si ottiene solo un xvalue quando si sta giocando intorno con 'certi tipi di espressioni che coinvolgono rvalue riferimenti'.Altrimenti temporanea oggetti sono solo oggetti temporanei.