Acabo de pasar una cantidad desordenada 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 en here.¿Por qué este código intenta llamar al constructor de copia?
Me pregunto por qué el siguiente código intenta llamar B(const B&)
en 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;
}
que no definió explícitamente ningún constructor, por lo B(std::move(binst))
debe llamar al compilador genera B(B&&)
, ¿no?
cuando cambio B
a
class B : public A {
public:
B() { }
B(B&&) { }
};
Se 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 es no y definitivamente no debería ser un requisito para su uso con mi clase de plantilla) tener un constructor de movimiento definido explícitamente.
¿Hay un compilador generado B (B &&)? Mi C++ 11 todavía está un poco oxidado. ¿Y tu B (B &&) necesitaría inicializar A (A y A)? – CashCow
@CashCow sí, todo lo que hace es mover cada miembro (si eso está mal, entonces te estoy mirando, Kerrek SB ':)') –
Compila bien en GCC 4.6, GCC 4.7 y Clang 3.0. –