El siguiente fragmento de código hace que el constructor de copia que se llamará donde esperaba el constructor paso a llamarse:¿Por qué se llama este constructor de copia en lugar de mover el constructor?
#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()); }
En VS11 Beta, en modo de depuración, este grabados:
Foo gets built!
Foo gets copied!
Foo gets copied!
he comprobado el estándar y Bar
parecen cumplir con todos los requisitos para generar automáticamente un constructor de movimiento predeterminado, pero eso no parece suceder a menos que exista otra razón por la cual no se puede mover el objeto. He visto muchas preguntas relacionadas con mover y copiar constructores por aquí, pero no creo que nadie haya tenido este problema específico.
¿Alguna sugerencia sobre qué está pasando aquí? ¿Es este comportamiento estándar?
¿'return std :: move (bar);' cambia algo? Por cierto, gcc 4.7.0 llama al constructor de movimientos (con copia elision desactivada). –
BTW, gcc 4.6.1 no llama ni a la copia ni al mover el cursor. –
g ++ 4.5.3 solo crea el objeto: "¡Foo se construye!" (elisión de copia), mientras que con copia elisión desactivada copia el objeto dos veces. ¿No se llama solo a un constructor de movimiento cuando tienes un valor r? No estoy del todo seguro de que Meow() califique. –