Неявно генерировать конструктор перемещения

Есть ли способ неявного создания конструктора перемещения для класса только для перемещения? Рассмотрим такой класс:

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 не имеет объявленного пользователем деструктора, и

— конструктор перемещения не будет неявно определен как удаленный.

0

Решение

Это не компилируется, потому что неявно объявленный конструктор копирования не может копировать p_. (12,8 / 7)

Нет необходимости в конструкторе копирования. Это не компилируется, потому что ваш компилятор не генерирует конструктор перемещения автоматически, что это должно.

Нет другого пути, кроме как реализовать его самостоятельно или обновить компилятор.

4

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

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

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