返回的对象如何可分配?

qdi*_*dii 18 c++ const rvalue

在Effective C++,第3项中,Scott Meyers建议重载operator*一个名为的类Rational:

    class Rational { ... };
    const Rational operator*(const Rational& lhs, const Rational& rhs);
Run Code Online (Sandbox Code Playgroud)

返回值被const限定的原因在下面的行中解释:如果不是const,程序员可以编写如下代码:

    (a * b) = c;
Run Code Online (Sandbox Code Playgroud)

或者,更可能是:

     if (a*b = c)
Run Code Online (Sandbox Code Playgroud)

很公平.现在我很困惑,因为我认为函数的返回值,这里是operator*,是一个rvalue,因此不能赋值.我认为它不是可转让的,因为如果我有:

    int foo();
    foo() += 3;
Run Code Online (Sandbox Code Playgroud)

那将无法编译invalid lvalue in assignment.为什么不在这里发生?有人可以对此有所了解吗?

编辑:我在Scott Meyers的那个项目上看到过很多其他线程,但是没有人解决我在这里暴露的rvalue问题.

cel*_*chk 30

关键是对于类类型,a = b它只是一个简写a.operator=(b),其中operator=是成员函数.并且可以在rvalues上调用成员函数.

请注意,在C++ 11中,您可以通过operator=仅使用lvalue 来禁止它:

class Rational
{
public:
  Rational& operator=(Rational const& other) &;
  // ...
};
Run Code Online (Sandbox Code Playgroud)

&讲述这个功能可能无法在右值被称为编译器.