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