在 Effective 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)
很公平。 现在我很困惑,因为我认为函数的返回值,这里是 operator*,是一个右值,因此不可赋值。我认为它不可分配,因为如果我有:
int foo();
foo() += 3;
如果赋值中的左值无效
,那将无法编译。
为什么这里没有发生这种情况?有人可以阐明这一点吗?
编辑:我在 Scott Meyers 的那个 Item 上看到了许多其他线程,但没有一个解决了我在这里暴露的右值问题。
最佳答案
重点是对于类类型,a = b
只是a.operator=(b)
的简写,其中operator=
是一个成员函数。并且可以在右值上调用成员函数。
请注意,在 C++11 中,您可以通过使 operator=
为左值来禁止它:
class Rational
{
public:
Rational& operator=(Rational const& other) &;
// ...
};
&
告诉编译器不能对右值调用此函数。
关于c++ - 返回的对象如何分配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39728354/