Ho appena trascorso una quantità eccessiva di tempo a trafficare con un errore di complilazione in Visual Studio. Ho distillato il codice nel piccolo esempio compilabile di seguito e provato su IdeOne e ho ottenuto lo stesso errore che è possibile vedere here.Perché questo codice tenta di chiamare il costruttore di copie?
Mi chiedo il motivo per cui il seguente codice tenta di chiamare B(const B&)
invece di 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;
}
io non indicava esplicitamente alcun costruttore, in modo B(std::move(binst))
dovrebbe chiamare il compilatore ha generato B(B&&)
, no?
Quando cambio B
a
class B : public A {
public:
B() { }
B(B&&) { }
};
Si compila bene. Perchè è questo?
Sarà estremamente sconveniente se questo non può essere risolto dalla classe base perché ho una classe template che usa il posizionamento new e sposta i costruttori come nell'esempio, e richiederà ogni classe che non è copiabile (che è non e sicuramente non dovrebbe essere un requisito per l'uso con la mia classe template) per avere un costruttore di move esplicitamente definito.
C'è un compilatore generato B (B &&)? Il mio C++ 11 è ancora un po 'arrugginito. E il tuo B (B &&) ha bisogno di inizializzare A (A &&)? – CashCow
@CashCow si, tutto ciò che fa è spostare ogni membro (se questo è sbagliato allora ti sto guardando, Kerrek SB ':)') –
Compila bene su GCC 4.6, GCC 4.7 e Clang 3.0. –