¿Por qué el constructor de movimiento predeterminado o el operador de asignación no se creó para las clases derivadas? Para demostrar lo que quiero decir; teniendo este código de configuración:Mover constructor y operador de asignación: ¿por qué no hay un valor predeterminado para las clases derivadas?
#include <utility>
struct A
{
A() { }
A (A&&) { throw 0; }
A& operator= (A&&) { throw 0; }
};
struct B : A
{ };
cualquiera de las siguientes líneas de lanza:
A x (std::move (A());
A x; x = A();
pero ninguno de estos procedimientos hace:
B x (std::move (B());
B x; x = B();
En caso de que importa, he probado con GCC 4.4 .
EDITAR: La prueba posterior con GCC 4.5 mostró el mismo comportamiento.
¿El 'std :: move' cambia algo aquí? ¿No es 'A()' ya un valor r? –
Sí, lo hace. De lo contrario, C++ estándar permite al compilador comprimirlo en just-construct-x (o eso me dijeron en freenode.net). También verifiqué que sin 'std :: move' el constructor de movimiento no se trigerred, por lo que el comentario de freenode.net parece ser cierto. – doublep
@Mike: la elisión de copia (12.8/34, 0x FCD) es una optimización común, pero al usar move() hace que esta expresión quede fuera de las circunstancias permitidas. –