Я просто потратил слишком много времени на то, чтобы возиться с ошибкой компиляции в Visual Studio. Я переработал код в небольшой компилируемый пример ниже, попробовал его на IdeOne и получил ту же ошибку, которую вы можете увидеть здесь .
Мне интересно, почему следующий код пытается вызвать B (const B &)
вместо 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 << bptr->data << endl;
delete[] buf;
}
Я не определил никаких конструкторов явно, поэтому B (std :: move (binst))
должен вызывать созданный компилятором B (B &&)
, нет?
Когда я меняю B
на
class B : public A {
public:
B() { }
B(B&&) { }
};
Компилируется нормально. Почему это?
Будет крайне неудобно, если это не может быть исправлено из базового класса, потому что у меня есть шаблонный класс, который использует размещение конструкторов new и move, как в примере, и потребует, чтобы каждый класс не копируемый (что не является и определенно не должно быть требованием для использования с моим классом шаблона) иметь явно определенный конструктор перемещения.