sobrecarga que programacion orientada objetos objeto herencia ejemplo destructores constructores codigo clases c++ c++11 copy-constructor placement-new move-constructor

programacion - que es un objeto en c++



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

Acabo de pasar una cantidad desorbitada de tiempo jugando con un error de compilación en Visual Studio. He destilado el código en el pequeño ejemplo compilable 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 <iostream> 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 << bptr->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 compilador generado B(B&&) , ¿no?

Cuando cambio B a

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

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


Debe enfrentar un error de compilació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 ).


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