Могут ли операции присваивания, объявленные по умолчанию, иметь квалификаторы ссылок?
При объявлении операций присваивания какdefault
, есть ли что-то неправильное в том, чтобы сделать их квалифицированными ссылками, чтобы предотвратить присвоение временным? (Чаще всего это предотвращает глупые ошибки). Общие ресурсы ничего не говорят о квалификаторах ссылок для операций «по умолчанию», и почти каждый пример, который я видел до сих пор, не объявляет их с правильным квалификатором ref.
Говорит ли стандарт языка что-нибудь о квалификаторах ссылок, объявляющих операции присваивания по умолчанию.
- Это разрешено?
- Есть ли что-то неправильное в этом? В конце концов, за очень немногими исключениями, присваивание rvalue не имеет смысла.
- Я понимаю, что они не были сделаны эталонными по умолчанию для обратной совместимости, но есть ли причина для этого? (В случае, если ответ на первый вопрос «да», а ответ на второй «нет»).
1 ответ
Разрешается определять оператор присваивания по умолчанию с дополнительным квалификатором ref. См. [dcl.fct.def.default]/2.1 .
Стоит ли вам на самом деле это делать — вопрос, основанный на мнении. Я не вижу ничего явно плохого в том, чтобы добавить&
, но я подозреваю, что вы столкнетесь с сопротивлением, если попытаетесь убедить всех в вашей команде сделать это, потому что это действительно может выявить некоторые ошибки, но очень немногие, и почти все эти ошибки, скорее всего, в любом случае будут внутри модульных тестов. (Напротив, такие ошибки, какif (x = 3)
, где левая сторона — это lvalue , встречаются гораздо чаще, и вы их не поймаете, но, возможно, компилятор выдаст предупреждение.)
Это похоже на то, как вам может быть трудно убедить людей заявить о своейconst char*
переменные какconst char* const
если они знают, что указатель не изменится. Конечно, это немного повышает безопасность, но также требует дополнительного набора текста.