Il seguente frammento di codice fa sì che il costruttore di copia per essere chiamato in cui mi aspettavo il costruttore mossa per essere chiamato:Perché viene chiamato questo costruttore di copia anziché il costruttore di mosse?
#include <cstdio>
struct Foo
{
Foo() { puts("Foo gets built!"); }
Foo(const Foo& foo) { puts("Foo gets copied!"); }
Foo(Foo&& foo) { puts("Foo gets moved!"); }
};
struct Bar { Foo foo; };
Bar Meow() { Bar bar; return bar; }
int main() { Bar bar(Meow()); }
Su VS11 Beta, in modalità debug, questa stampa:
Foo gets built!
Foo gets copied!
Foo gets copied!
ho controllato lo standard e Bar
sembrano soddisfare tutti i requisiti per generare automaticamente un costruttore di mosse predefinito, ma ciò non sembra avvenire a meno che non ci sia un altro motivo per cui l'oggetto non possa essere spostato. Ho visto molte domande relative alla costruzione e alla copia del costruttore qui intorno, ma non credo che nessuno abbia avuto questo problema specifico.
Qualsiasi suggerimento su cosa sta succedendo qui? Questo comportamento standard è?
Fa 'return std :: move (bar);' cambia qualcosa? BTW, gcc 4.7.0 chiama il costruttore di movimento (con copia elision disattivata). –
BTW, gcc 4.6.1 non chiama né la copia né lo spostamento. –
g ++ 4.5.3 crea solo l'oggetto: "Foo gets built!" (copia elisione), mentre con copia elettronica disabilitata copia l'oggetto due volte. Il costruttore di movimenti non è chiamato solo quando hai un valore? Non sono del tutto sicuro che Meow() si qualifichi. –