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