Qual è il riferimento R-Valore che sta per venire nella norma ++ prossimo c?
-
21-08-2019 - |
Domanda
Ciò che è di riferimento R-valore che sta per venire in prossimo standard C ++?
Soluzione 3
Ecco un tempo molto lungo articolo da Stephan T. Lavavej
Altri suggerimenti
Date un'occhiata a Perché C ++ 0x non di riferimento rvalue il default? , il che spiega il loro utilizzo pratico abbastanza bene.
Esso permette di distinguere tra il codice che ha chiamato passando un riferimento a un valore r o l-value. Ad esempio:
void foo(int &x);
foo(1); // we are calling here with the r-value 1. This would be a compilation error
int x=1;
foo(x); // we are calling here with the l-value x. This is ok
Utilizzando un riferimento r-value, si può permettere di passare riferimenti provvisori come nel primo esempio sopra:
void foo(int &&x); // x is an r-value reference
foo(1); // will call the r-value version
int x=1;
foo(x); // will call the l-value version
Questo è più interessante quando stiamo volendo passare il valore di ritorno di una funzione che crea un oggetto ad un'altra funzione che utilizza tale oggetto.
std::vector create_vector(); // creates and returns a new vector
void consume_vector(std::vector &&vec); // consumes the vector
consume_vector(create_vector()); // only the "move constructor" needs to be invoked, if one is defined
Il costruttore mossa agisce come il costruttore di copia, ma è definito prendere un riferimento r-valore piuttosto che un riferimento (const) l-value. E 'consentito utilizzare la semantica R-valore per spostare i dati fuori dalla temporanea creata nel create_vector
e spingerli in argomento per consume_vector
senza fare una copia costoso di tutti i dati nel vettore.