2010-04-22 6 views
6

¿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.

+1

¿El 'std :: move' cambia algo aquí? ¿No es 'A()' ya un valor r? –

+0

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

+2

@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. –

Respuesta

6

Leyendo a través de 12.8 en el 0x FCD (12.8/17 en particular para el cursor de movimiento), esto parece ser un error de GCC. Veo que ocurre lo mismo en 4.5 que en 4.4.

Me puede estar faltando un caso de esquina en las funciones eliminadas, o algo similar, pero todavía no veo ninguna indicación de eso.

+0

Acabo de probar con 4.5, obtengo los mismos resultados. ¿Puedes probar en cualquier otro compilador? (Dado que C++ 0x no está terminado de ninguna manera, podría ser un error, sino un comportamiento desactualizado, por cierto.) – doublep

+3

Un montón de cosas en 12.8 (originadas en N3053) no se admiten en 'gcc' sin embargo, según su [página de soporte de C++ 0x] (http://gcc.gnu.org/projects/cxx0x.html), ¿podría ser este el problema? –

+0

@Mike: parece que sí. –

Cuestiones relacionadas