Что означает пользователь, объявленный для неявно объявленного оператора присваивания перемещения?
Заявление
Неявно объявленный оператор присваивания перемещения
Если для типа класса (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&&)
не является оператором присваивания копии и, следовательно, не влияет на неявное объявление оператора присваивания перемещения (или копирования).