Почему этот код пытается вызвать конструктор копирования? - PullRequest
17 голосов
/ 24 января 2012

Я потратил слишком много времени на ошибку компиляции в 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&&) { }
};

Компилируется нормально.Почему это так?

Будет крайне неудобно, если это невозможно исправить из базового класса, потому что у меня есть шаблонный класс, который использует размещение новых и перемещает конструкторы, как в примере, и для этого потребуется каждый класс, которыйне может копироваться (что не является и, безусловно, не должно быть требованием для использования с моим классом шаблона), чтобы иметь явно определенный конструктор перемещения.

Ответы [ 2 ]

16 голосов
/ 24 января 2012

Если вы используете Visual Studio 2010 или 2012, имейте в виду: компилятор не автоматически генерирует конструкторы перемещения для вас. Это не было реализовано. Поэтому вам нужно написать их самостоятельно.

6 голосов
/ 24 января 2012

Вы должны столкнуться с ошибкой компилятора. Стандарт говорит, что B получает неявно объявленный и определенный конструктор перемещения; все условия 12.8 (9) выполнены (т.е. B не имеет явно объявленного конструктора копирования, копирования-назначения и т. д., и конструктор перемещения не будет неявно объявлен deleted).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...