Supponiamo di avere questa classe:C++ 11 mossa costruttore non chiama, costruttore predefinito preferito
class X {
public:
explicit X (char* c) { cout<<"ctor"<<endl; init(c); };
X (X& lv) { cout<<"copy"<<endl; init(lv.c_); };
X (X&& rv) { cout<<"move"<<endl; c_ = rv.c_; rv.c_ = nullptr; };
const char* c() { return c_; };
private:
void init(char *c) { c_ = new char[strlen(c)+1]; strcpy(c_, c); };
char* c_;
};
e questo utilizzo di esempio:
X x("test");
cout << x.c() << endl;
X y(x);
cout << y.c() << endl;
X z(X("test"));
cout << z.c() << endl;
Il risultato è:
ctor
test
copy
test
ctor <-- why not move?
test
Sto usando VS2010 con le impostazioni predefinite. Mi aspetto che l'ultimo oggetto (z
) venga spostato, ma non lo è! Se utilizzo X z(move(X("test")));
, le ultime righe dell'output sono ctor move test
, come previsto. È un caso di (N) RVO?
Q: il chiamante deve essere chiamato secondo lo standard? Se è così, perché non si chiama?
E 'copia elisione. Se l'elisione della copia falliva, si verificherà una mossa. Perché il titolo del tuo post dice "costruttore preferito predefinito"? Non viene chiamato alcun costruttore predefinito e al posto del costruttore di movimento non viene preferito nulla. Viene completamente eliminato. –
Questo codice non dovrebbe essere compilato da C++ 11; una stringa letterale non può essere convertita implicitamente in 'char *' non-const. –