¿Por qué este código intenta llamar al constructor de copia?

Acabo de pasar una cantidad desorbitada de tiempo jugando con un error de comstackción en Visual Studio. He destilado el código en el pequeño ejemplo comstackble a continuación y lo probé en IdeOne y obtuve el mismo error que puede ver aquí .

Me pregunto por qué el siguiente código intenta llamar a B(const B&) lugar de B(B&&) :

 #include  using namespace std; class A { public: A() : data(53) { } A(A&& dying) : data(dying.data) { dying.data = 0; } int data; private: // not implemented, this is a noncopyable class A(const A&); A& operator=(const A&); }; class B : public A { }; int main() { B binst; char* buf = new char[sizeof(B)]; B* bptr = new (buf) B(std::move(binst)); cout <data << endl; delete[] buf; } 

No B(std::move(binst)) explícitamente ningún constructor, por lo que B(std::move(binst)) debería llamar al comstackdor generado B(B&&) , ¿no?

Cuando cambio B a

 class B : public A { public: B() { } B(B&&) { } }; 

Comstack bien. ¿Por qué es esto?

Será extremadamente inconveniente si esto no se puede solucionar desde la clase base porque tengo una clase de plantilla que usa colocación nueva y mueve constructores como el ejemplo, y se requerirá que cada clase no se pueda copiar (que no es y definitivamente debería no ser un requisito para usar con mi clase de plantilla) para tener un constructor de movimiento definido explícitamente.

Si está usando Visual Studio 2010 o 2012, tenga en cuenta: el comstackdor no genera automáticamente constructores de movimiento para usted. Eso no fue implementado. Entonces necesitas escribirlos tú mismo.

Debe enfrentar un error de comstackción. El estándar dice que B obtiene un constructor de movimiento definido y definido implícitamente; se cumplen todas las condiciones de 12.8 (9) (es decir, B no tiene un constructor de copia explícitamente declarado, una copia de asignación, etc., y el constructor de movimiento no se declararía implícitamente deleted ).