Зачем объявлять операторы удаленного присваивания с помощью ref-qualifier & - PullRequest
0 голосов
/ 21 сентября 2018

Насколько я знаю, операторы назначения, объявленные пользователем, отличаются от встроенных операторов, как объяснено этим ответом stackoverflow .Но зачем добавлять «&» к удаленному оператору?

// C++
class MyType
{
public:
 // ...

  MyType& operator=(MyType const&) & = delete;
  MyType& operator=(MyType &&) & noexcept = default;

// more
};

Я спрашиваю, потому что моя программа проверки статического кода сообщает о нарушении правил, и я не вижу причин добавлять «&» для удаленного оператора,Я что-то пропустил?

1 Ответ

0 голосов
/ 21 сентября 2018

Нет смысла добавлять квалификатор & в этом случае.

Смысл в том, чтобы запретить вашему классу быть назначаемым для копирования, точка.Назначение квалификатора & состоит в том, чтобы исключить возможность присвоения копии для rvalue вашего класса (& помешает оператору назначения копирования быть жизнеспособной функцией в этом случае).Но это здесь не ваша цель - вы хотите, чтобы все копия копирования была неправильно сформирована, так что это просто:

MyType& operator=(MyType const&) = delete;

И жаловаться тому, кто написал эту статическую проверку.

Проблема с:

MyType& operator=(MyType const&) & = delete;

заключается в том, что дополнительная точность оператора, который вы удаляете, предполагает намерение, которого там нет.Меня сразу же заставляет задуматься, есть ли где-то позже в классе, по какой-то причине, у вас:

MyType& operator=(MyType const&) && { ... }

А вы нет, потому что это глупо.

...