При определении оператора присваивания, он неизменно выглядит следующим образом:Возврат типа оператора присваивания
class X {...};
X& X::operator=(...whatever...);
То есть, он имеет тип возвращаемого значения «ссылка на X». Здесь параметры (...whatever...
) могут быть X&
, const X&
, только X
при использовании copy-and-swap idiom или любого другого типа.
Кажется странным, что everyone recommends returning a non-const reference to X
, независимо от параметров. Это явно допускает выражения типа (a = b).clear()
, который должен быть хорошим.
У меня другое мнение, и я хочу запретить выражения, подобные , (x=y)=z
и даже x=y=z
в моем коде. Моя идея состоит в том, что эти выражения слишком сложны в одной строке кода. Поэтому я решил, чтобы мои операторы присваивания возвращают void
:
void X::operator=(X) {...}
void X::operator=(int) {...}
Какие негативные последствия это имеет? (за исключением вида, отличного от обычного)
Может ли мой класс X использоваться со стандартными контейнерами (например, std::vector<X>
)?
Я использую C++ 03 (если это имеет значение).
согласился, я пропустил с самого начала. – billz
В C++ существует всеобъемлющая рекомендация: * перегруженные операторы должны вести себя так же, как и для целых чисел *. Цепочка возможна для целых чисел ('a = b = c = 3'), и поэтому следует сохранять эту синтаксическую возможность при перегрузке. –
@ MatthieuM. +1. Конечно, как всегда, хорошие правила имеют еще лучшие исключения: '' 'на потоках приходит на ум. – Angew