Правила Ноль/Пять/Шесть нарушены?
Операции присваивания должны быть квалифицированы ссылкой - и вопрос здесь не в том, "есть ли смысл присваивать rvalue", а в правильности. По умолчанию операции присваивания возвращают ссылки lvalue. Следовательно, следующий код действителен
Class A{
// implicitly generated assignment operations
};
int main() {
// ...
A& a = A{} = A{};
}
Этот код успешно компилируется без предупреждения. Я предполагаю, что код, подобный приведенному выше, редко встречается на практике, и именно по этой причине квалифицированные конструкторы без ссылок работают на практике, но зачем допускать это в первую очередь? Это еще один способ оторвать ногу.
Я думал, что (плохой причиной) может быть обратная совместимость, но я заглянул в Основные рекомендации C++ и увидел это (C.20). Кроме того, в большинстве книг и учебных ресурсов это не упоминается (иногда они также не упоминают все члены функций, квалифицированных по ссылкам, за единственным почетным исключением, являющимся C++ Primes, в котором также обсуждаются присвоения, квалифицированные по ссылкам, но кажется, что 5-е издание было последний, к сожалению).
Вот вопросы.
- Почему операции присваивания по умолчанию не являются квалифицированными ссылками? Если причиной является обратная совместимость, в большинстве случаев «сломанный» код, вероятно, в первую очередь неверен (если мы рассматриваем результат присваивания как ссылку) - я считаю, что код, который не обрабатывает результат оператора присваивания как ссылка, а значение, однако проблем быть не должно.
- Почему, когда рекомендуется объявлять операторы присваивания «по умолчанию», почти никогда не рекомендуется делать их квалифицированными по ссылке? (Редко упоминается). Есть ли для этого веская причина, или просто люди не знают об этом?
- Если поведение операторов присваивания по умолчанию должно быть квалифицировано по ссылке (слева — ссылка на lvalue), означает ли это, что Правило нуля вообще нарушается?