Могут ли операции присваивания, объявленные по умолчанию, иметь квалификаторы ссылок?

При объявлении операций присваивания какdefault, есть ли что-то неправильное в том, чтобы сделать их квалифицированными ссылками, чтобы предотвратить присвоение временным? (Чаще всего это предотвращает глупые ошибки). Общие ресурсы ничего не говорят о квалификаторах ссылок для операций «по умолчанию», и почти каждый пример, который я видел до сих пор, не объявляет их с правильным квалификатором ref.

Говорит ли стандарт языка что-нибудь о квалификаторах ссылок, объявляющих операции присваивания по умолчанию.

  1. Это разрешено?
  2. Есть ли что-то неправильное в этом? В конце концов, за очень немногими исключениями, присваивание rvalue не имеет смысла.
  3. Я понимаю, что они не были сделаны эталонными по умолчанию для обратной совместимости, но есть ли причина для этого? (В случае, если ответ на первый вопрос «да», а ответ на второй «нет»).

1 ответ

Разрешается определять оператор присваивания по умолчанию с дополнительным квалификатором ref. См. [dcl.fct.def.default]/2.1 .

Стоит ли вам на самом деле это делать — вопрос, основанный на мнении. Я не вижу ничего явно плохого в том, чтобы добавить&, но я подозреваю, что вы столкнетесь с сопротивлением, если попытаетесь убедить всех в вашей команде сделать это, потому что это действительно может выявить некоторые ошибки, но очень немногие, и почти все эти ошибки, скорее всего, в любом случае будут внутри модульных тестов. (Напротив, такие ошибки, какif (x = 3), где левая сторона — это lvalue , встречаются гораздо чаще, и вы их не поймаете, но, возможно, компилятор выдаст предупреждение.)

Это похоже на то, как вам может быть трудно убедить людей заявить о своейconst char*переменные какconst char* constесли они знают, что указатель не изменится. Конечно, это немного повышает безопасность, но также требует дополнительного набора текста.

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