Почему этот код пытается вызвать конструктор копирования?

Я просто потратил слишком много времени на то, чтобы возиться с ошибкой компиляции в 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, как в примере, и потребует, чтобы каждый класс не копируемый (что не является и определенно не должно быть требованием для использования с моим классом шаблона) иметь явно определенный конструктор перемещения.

18
задан Seth Carnegie 24 January 2012 в 18:20
поделиться