Удаление конструктора копирования / функции назначения копирования также неявно удаляет функцию перемещения-конструктора / назначения перемещения.Если вы намереваетесь сделать объект подвижным, но не копируемым, вам также необходимо default
конструктор перемещения.
class MoveOnlyClass
{
public:
MoveOnlyClass() {};
MoveOnlyClass& operator=(const MoveOnlyClass& other) = delete;
MoveOnlyClass(const MoveOnlyClass& other) = delete;
MoveOnlyClass& operator=(MoveOnlyClass&& other) = default;
MoveOnlyClass(MoveOnlyClass&& other) = default;
};
//Will now compile as you expect
int main()
{
std::vector<MoveOnlyClass> vec;
vec.push_back(std::move(MoveOnlyClass()));
}
Кроме того, std::move(T())
является избыточным;создание такого объекта на месте уже сделает его R-значением, а использование std::move
, когда вам не нужно, может предотвратить некоторые виды оптимизации компилятора (например, Copy Ellision).