返回的对象如何可分配?

时间:2012-01-12 08:55:25

标签: c++ const rvalue

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

    class Rational { ... };
    const Rational operator*(const Rational& lhs, const Rational& rhs);

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

    (a * b) = c;

或者更可能是:

     if (a*b = c)

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

    int foo();
    foo() += 3;

无法使用invalid lvalue in assignment进行编译。 为什么不在这里发生?有人可以对此有所了解吗?

编辑:我在Scott Meyers的那篇文章中看到了许多其他主题,但没有人解决我在这里曝光的右值问题。

1 个答案:

答案 0 :(得分:30)

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

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

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

&告诉编译器可能不会在rvalues上调用此函数。