Почему этот удаленный конструктор перемещения принят компилятором? - PullRequest
0 голосов
/ 04 ноября 2018

В следующем примере кода у меня нет особых причин удалять конструктор перемещения, но я не понимаю, почему он компилируется (x - это объект, который печатает, был ли он перемещен или скопирован).

class foo {
    X x;

public:
    foo()=default;
    foo(const foo &)=default;
    foo(foo &&)=delete;
};

int main()
{
    vector<foo> v;
    foo a;

    v.push_back(a);
    v.push_back(a);
}

Второй раз push_back вызывается на std::vector, он перемещает уже существующий объект, обычно с помощью операции перемещения. С конструктором перемещения foo, объявленным по умолчанию, я вижу, как это происходит.

Однако, когда конструктор перемещения явно удаляется, я ожидаю, что компиляция не удастся, так как она все еще доступна для перегрузки, но удалена.
Он компилируется, а векторное перераспределение использует конструктор копирования.

Что здесь происходит?

Ответы [ 3 ]

0 голосов
/ 04 ноября 2018

Я думаю, что вы используете конструктор копирования здесь, не так ли? foo(const foo &). Имейте в виду, что в c ++ объекты являются типами значений, а не ссылочными типами.

0 голосов
/ 05 ноября 2018

Чтобы переместиться a в вектор, вы должны сделать его r-значением, то есть использовать std::move(a) вместо просто a. Я полагаю, что если вы сделаете это, ваш код выдаст ошибку при удаленном перемещении ctor.

0 голосов
/ 04 ноября 2018

std::vector::resize() переместится, если сможет, и скопирует, если необходимо. Это чрезвычайно полезно, так как не все копируемые типы являются подвижными. Имейте в виду, что в c ++ объекты являются типами значений, а не ссылочными типами.

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