18

在 Effective C++, Item 3 中,Scott Meyers 建议operator*对名为 的类进行重载Rational

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

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

    (a * b) = c;

或者,更有可能:

     if (a*b = c)

很公平。现在我很困惑,因为我认为一个函数的返回值,这里是 operator*,是一个右值,因此不可赋值。我认为它不可分配,因为如果我有:

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

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

编辑:我在 Scott Meyers 的那个项目上看到了许多其他线程,但没有一个解决我在这里暴露的右值问题。

4

1 回答 1

30

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

请注意,在 C++11 中,您可以通过operator=仅设置左值来抑制它:

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

告诉编译器这个&函数不能在右值上调用。

于 2012-01-12T09:01:18.317 回答