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