Как можно по-прежнему считать тип с подавленной конструкцией / назначением перемещения подвижным?

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

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

Можете ли вы дать мне знать, правильно ли моё понимание?

26

Решение

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

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

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

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

Точнее, класс copyable все еще MoveConstructible а также MoveAssignable .

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

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

а также

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

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

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

31

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector