una programacion por orientada omision objetos miembros metodos ejemplos destructores copia constructores codigo clases clase c++ visual-c++ c++11 copy-constructor move-constructor

c++ - programacion - ¿Por qué se llama este constructor de copia en lugar de mover el constructor?



metodos en c++ (1)

Desafortunadamente, VS11 no proporciona un constructor de movimiento predeterminado. Consulte Mover semántica en la sección Observaciones - para citar:

A diferencia del constructor de copia predeterminado, el compilador no proporciona un constructor de movimiento predeterminado.

El siguiente fragmento de código hace que se llame al constructor de copias donde esperaba que se llamara el constructor de movimientos:

#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, imprime:

Foo gets built! Foo gets copied! Foo gets copied!

Comprobé el estándar y Bar parece cumplir todos los requisitos para generar automáticamente un constructor de movimientos predeterminado, pero eso no parece suceder a menos que haya 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 lo que está pasando aquí? ¿Es este comportamiento estándar?