Как можно возвращать возвращаемый объект?
В Эффективном С++, пункт 3, Скотт Майерс предлагает перегружать operator*
для класса с именем Rational
:
class Rational { ... };
const Rational operator*(const Rational& lhs, const Rational& rhs);
Причина для возвращаемого значения const
-qualified объясняется в следующей строке: если это не было const
, программисты могли написать код, например:
(a * b) = c;
или, более вероятно:
if (a*b = c)
Достаточно честный.
Теперь Im запутался, поскольку я думал, что возвращаемое значение функции, здесь оператор *, было rvalue, поэтому не назначалось. Я считаю, что это не назначается, потому что если бы у меня было:
int foo();
foo() += 3;
который не смог бы скомпилировать с помощью invalid lvalue in assignment
.
Почему это не происходит? Может кто-то пролить свет на это?
РЕДАКТИРОВАТЬ. Я видел много других потоков на этом самом предмете Скотта Мейерса, но никто не решал проблему с rvalue, которую я раскрыл здесь.
Ответы
Ответ 1
Дело в том, что для типов классов a = b
является просто сокращением до a.operator=(b)
, где operator=
является функцией-членом. И функции-члены могут быть вызваны на rvalues.
Обратите внимание, что в С++ 11 вы можете запретить это, сделав operator=
lvalue-only:
class Rational
{
public:
Rational& operator=(Rational const& other) &;
// ...
};
&
сообщает компилятору, что эта функция не может быть вызвана на rvalues.