Как можно присвоить возвращаемый объект?
Вопрос
В разделе 3 «Эффективный C ++» Скотт Мейерс предлагает перегрузить operator*
для класса с именем Rational
:
Причина, по которой возвращаемое значение квалифицируется как const
, объясняется в следующей строке: если бы это было не const
, программисты могли бы написать такой код, как:
или, что более вероятно:
родовое словоДостаточно честно. Теперь я запутался, так как думал, что возвращаемое значение функции, здесь operator *, было rvalue, поэтому не могло быть присвоено.Я считаю, что это не может быть назначено, потому что если бы у меня было:
родовое слово, который не удалось скомпилировать с помощью invalid lvalue in assignment
.
Почему здесь этого не происходит?Может кто-нибудь пролить свет на это?
РЕДАКТИРОВАТЬ : я видел много других тем, посвященных этому же пункту Скотта Мейерса, но ни одна из них не решала проблему rvalue, которую я описал здесь.
Решение
Дело в том, что для типов классов a = b
- это просто сокращение от a.operator=(b)
, где operator=
- функция-член.А функции-члены могут вызываться для rvalue.
Обратите внимание, что в C ++ 11 вы можете запретить это, сделав operator=
lvalue-only:
Код &
сообщает компилятору, что эту функцию нельзя вызывать для значений r.