返回的对象如何可赋值

How can a returned object be assignable?

本文关键字:何可 赋值 对象 返回      更新时间:2023-10-16

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

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

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

    (a * b) = c;

或者,更有可能:

     if (a*b = c)

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

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

将无法使用CCD_ 5进行编译。为什么这里不发生这种事?有人能解释一下吗?

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

重点是,对于类类型,a = b只是a.operator=(b)的简写,其中operator=是一个成员函数。成员函数可以在右值上调用。

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

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

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