Есть ли способ неявного создания конструктора перемещения для класса только для перемещения? Рассмотрим такой класс:
class moveable_only
{
unique_ptr<int> p_;
};
moveable_only m;
foo(std::move(m));
Это не компилируется, потому что неявно объявленный конструктор копирования не может копировать p_. (12,8 / 7)
Если определение класса не объявляет явно конструктор копирования, он объявляется неявно. Если определение класса объявляет конструктор перемещения или оператор присваивания перемещения, неявно объявленный конструктор копирования определяется как удаленный; в противном случае он определяется как дефолтный (8.4).
Теперь рассмотрим это:
class moveable_only
{
unique_ptr<int> p_;
moveable_only(const moveable_only&);
moveable_only& operator = (const moveable_only&);
};
moveable_only m;
foo(std::move(m));
Это не компилируется также, из-за 12.8 / 9
Если определение класса X явно не объявляет конструктор перемещения, он будет неявно объявлен как дефолтный, если и только если
— X не имеет объявленного пользователем конструктора копирования,
— X не имеет заявленного пользователем оператора копирования,
— X не имеет объявленного пользователем оператора назначения перемещения,
— X не имеет объявленного пользователем деструктора, и
— конструктор перемещения не будет неявно определен как удаленный.
Это не компилируется, потому что неявно объявленный конструктор копирования не может копировать p_. (12,8 / 7)
Нет необходимости в конструкторе копирования. Это не компилируется, потому что ваш компилятор не генерирует конструктор перемещения автоматически, что это должно.
Нет другого пути, кроме как реализовать его самостоятельно или обновить компилятор.
Других решений пока нет …