struct copyable { // and movable
copyable() = default;
copyable(copyable const&) { /*...*/ };
copyable& operator=(copyable const&) { /*...*/ return *this; }
};
Поскольку функции-конструктор копирования и операции назначения копирования явно определены, это означает, что конструктор перемещения и функция назначения перемещения не могут быть явно определены компилятором, и, следовательно, операция перемещения не разрешена.
Можете ли вы дать мне знать, правильно ли моё понимание?
это означает, что конструктор перемещения и функция присваивания перемещения не могут быть явно определены компилятором
Да это правильно.
и, следовательно, операция перемещения не допускается.
Нет, операции перемещения по-прежнему можно выполнять с помощью конструктора копирования и оператора назначения копирования (хотя это может быть и не так, как вы ожидали), поскольку значение r всегда можно связать с const&
,
Точнее, класс copyable
все еще MoveConstructible а также MoveAssignable .
Класс не должен реализовывать конструктор перемещения, чтобы удовлетворить это требование типа: конструктор копирования, который принимает const T& Аргумент может связывать выражения rvalue.
Если класс MoveConstructible реализует конструктор перемещения, он также может реализовать семантику перемещения, чтобы воспользоваться тем фактом, что значение rv после построения не определено.
а также
Тип не должен реализовывать оператор присваивания перемещения, чтобы удовлетворить это требование типа: оператор присваивания копии, который принимает свой параметр по значению или как постоянный тип&, будет привязан к аргументу rvalue.
Если класс MoveAssignable реализует оператор присваивания перемещения, он также может реализовывать семантику перемещения, чтобы использовать тот факт, что значение rv после присваивания не определено.
Как указал @Curious, вы можете объявить конструктор перемещения и оператор присваивания перемещения удалять явно сделать copyable
непоколебимы; затем с помощью выражения Rvalue delete
Будет выбрана перегрузка ed, и компиляция не удастся.
Других решений пока нет …