Io uso il codice qui sotto verificare la copia di elisione:Perché copiare elision non funziona con std :: move?
class foo
{
public:
foo() {cout<<"ctor"<<endl;};
foo(const foo &rhs) {cout<<"copy ctor"<<endl;}
};
int g(foo a)
{
return 0;
}
int main()
{
foo a;
g(std::move(a));
return 0;
}
mi aspettavo solo il costruttore di default sarebbe chiamato perché l'argomento di g()
è un rvalue e la copia verrà tralasciata. Ma il risultato mostra che sono chiamati sia il costruttore di default che il costruttore di copie. Perché?
E se si modifica la chiamata di funzione a g(foo())
, la copia verrà eliminata. Qual è la differenza tra i tipi di ritorno di foo()
e std::move(a)
? Come posso fare in modo che il compilatore elide copia su un lvalue?
Non è possibile.'g' prende il suo parametro in base al valore, quindi il compilatore deve assicurarsi che l'oggetto passato sia distinto da qualsiasi oggetto accessibile dall'ambito chiamante. Se l'oggetto che viene passato è un lvalue, non c'è un temporaneo da eliminare e una copia non può essere eliminata. –
Quante chiamate al distruttore ti aspettavi? ;) – curiousguy
Si consiglia di [leggere] (http://stackoverflow.com/a/11540204/252000) su cosa 'std :: move' effettivamente fa. – fredoverflow