Если вы беспокоитесь, что возвращение неправильной вещи может молча вызвать непреднамеренные побочные эффекты, вы можете написать operator=()
, чтобы вернуть void
. Я видел довольно много кода, который делает это (я полагаю, из-за лени или просто не зная, какой должен быть тип возвращаемого значения, а не для «безопасности»), и это вызывает немного проблем. Виды выражений, которые должны использовать ссылку, обычно возвращаемую operator=()
, используются довольно редко, и почти всегда легко использовать альтернативный код.
Я не уверен, что одобрил бы возврат void
(в обзоре кода я, вероятно, назвал бы это как то, что вы не должны делать), но я выкидываю это как вариант, чтобы рассмотреть если вы не хотите беспокоиться о том, как могут использоваться странные операции использования оператора присваивания.
позднее редактирование:
Кроме того, я должен был изначально упомянуть, что вы можете разделить разницу, если ваш operator=()
вернет const&
- что все еще позволит цепочку назначений:
a = b = c;
Но запретит некоторые из более необычных применений:
(a = b) = c;
Обратите внимание, что это делает оператор присваивания имеющим семантику, аналогичную той, которую он имеет в C, где значение, возвращаемое оператором =
, не является lvalue. В C ++ стандарт изменил его так, что оператор =
возвращает тип левого операнда, так что это lvalue, но, как отметил Стив Джессоп в комментарии к другому ответу, в то время как это делает так, что компилятор примет
(a = b) = c;
, даже для встроенных модулей, результатом является неопределенное поведение встроенных модулей, поскольку a
изменяется дважды без промежуточной точки последовательности. Этой проблемы избегают для не встроенных с operator=()
, потому что вызов функции operator=()
является точкой последовательности.