Что означает пользователь, объявленный для неявно объявленного оператора присваивания перемещения?

Заявление

Неявно объявленный оператор присваивания перемещения

Если для типа класса (struct, class или union) не заданы пользовательские операторы присваивания перемещения, и все из следующего верно:

нет заявленных пользователем конструкторов копирования;
нет объявленных пользователем конструкторов перемещения;
нет заявленных пользователем операторов копирования;
нет деструкторов, объявленных пользователем;

с заявленным пользователем оператором копирования делает это только

имя_класса & имя_класса:: operator= (имя_класса &&)

или любой operator=() определены?

Пример:

class Bar
{
public:
   Bar() = default;
   SomeClass some;
};

class Foo
{
public:
   Foo() = default;

   Foo& operator=(Bar&& bar) : some(std::move(bar.some))
   {
   }

   SomeClass some;
};

Соответствует ли это условию для явно объявленного оператора перемещения?

То же самое относится и к неявно объявленному конструктору перемещения.

1 ответ

Решение

Обратите внимание, что там написано "операторы назначения копирования, объявленные пользователем" (выделено мной). Не каждый оператор присваивания является оператором присваивания копии.

Для класса Xоператор копирования назначается как operator= который принимает параметр типа X, X&, const X&, volatile X&, или же const volatile X&, Так что ваши Foo::operator=(Bar&&) не является оператором присваивания копии и, следовательно, не влияет на неявное объявление оператора присваивания перемещения (или копирования).

Другие вопросы по тегам