Подтвердить что ты не робот

Как тип с подавленным движением construct/assign все еще считается подвижным?

struct copyable { // and movable
  copyable() = default;
  copyable(copyable const&) { /*...*/ };
  copyable& operator=(copyable const&) { /*...*/ return *this; }
};

Так как функции-конструктор копирования и операции присваивания копии явно определены, это означает, что конструктор перемещения и функция назначения перемещения не могут быть неявно определены компилятором, и поэтому операция перемещения не разрешена.

Не могли бы вы сообщить мне, правильное ли мое понимание?

4b9b3361

Ответ 1

это означает, что механизм перемещения и функция назначения перемещения не могут быть неявно определены компилятором

Да, это правильно.

и, следовательно, операция перемещения не допускается.

Нет, операции перемещения по-прежнему могут выполняться с помощью конструктора копирования и оператора присваивания копий (хотя это может быть и не так, как вы ожидали), поскольку значение r всегда может быть привязано к const&.

Точнее, класс copyable по-прежнему MoveConstructible и MoveAssignable.

Класс не должен реализовывать конструктор перемещения для удовлетворения требования этого типа: конструктор копирования, который принимает const T & аргумент может связывать выражения rvalue.

Если класс MoveConstructible реализует конструктор перемещения, он также может реализовать семантику перемещения, чтобы воспользоваться тем фактом, что значение rv после построения не определено.

и

Типу не нужно реализовывать оператор присваивания перемещения для удовлетворения этого требования: оператор присваивания копий, который принимает свой параметр по значению или в качестве константы типа &, связывается с аргументом rvalue.

Если класс MoveAssignable реализует оператор присваивания перемещения, он также может реализовать семантику перемещения, чтобы воспользоваться тем фактом, что значение rv после присвоения не указано.

Как указано @Curious, вы можете объявить конструктор перемещения и переместить оператор присваивания delete явно сделать copyable unmovable; затем с использованием выражения rvalue будет выбрана перегрузка delete ed и компиляция завершится с ошибкой.