#include <iostream>
using namespace std;
struct A
{
A()
{
cout << "A()" << endl;
}
~A()
{
cout << "~A()" << endl;
}
A(A&&)
{
cout << "A(A&&)" << endl;
}
A& operator =(A&&)
{
cout << "A& operator =(A&&)" << endl;
return *this;
}
};
struct B
{
// According to the C++11, the move ctor/assignment operator
// should be implicitly declared and defined. The move ctor
// /assignment operator should implicitly call class A's move
// ctor/assignment operator to move member a.
A a;
};
B f()
{
B b;
// The compiler knows b is a temporary object, so implicitly
// defined move ctor/assignment operator of class B should be
// called here. Which will cause A's move ctor is called.
return b;
}
int main()
{
f();
return 0;
}
Mi salida esperada debería ser:¿Por qué no en C++ de 11 se mueven constructor/asignación acto operador como se esperaba
A()
A(A&&)
~A()
~A()
Sin embargo, la salida real es: (El compilador de C++ es: Visual Studio 2012)
A()
~A()
~A()
¿Este es un error de VC++? o solo mi malentendido?
¿Por qué esperas que se llame al operador de asignación de movimiento de 'A'? – Praetorian
@ pretoriana: Cuando no se aplica RVO, C++ 11 dice que 'B' de retorno debe hacer un movimiento de 'B' en el valor de retorno. ¿Tal vez Visual Studio 2012 simplemente no implementa C++ 11 correctamente? –
@KevinBallard Sí, 'b' debe moverse. Pero eso debería dar como resultado una llamada al operador de * movimiento * de 'A', no al operador * de asignación de movimiento *. – Praetorian