Подтвердить что ты не робот

Как можно возвращать возвращаемый объект?

В Эффективном С++, пункт 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, которую я раскрыл здесь.

4b9b3361

Ответ 1

Дело в том, что для типов классов a = b является просто сокращением до a.operator=(b), где operator= является функцией-членом. И функции-члены могут быть вызваны на rvalues.

Обратите внимание, что в С++ 11 вы можете запретить это, сделав operator= lvalue-only:

class Rational
{
public:
  Rational& operator=(Rational const& other) &;
  // ...
};

& сообщает компилятору, что эта функция не может быть вызвана на rvalues.