【发布时间】:2012-02-08 13:52:38
【问题描述】:
在 Effective C++ 第 3 条中,Scott Meyers 建议为名为 Rational 的类重载 operator*:
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 的那个项目上看到了许多其他线程,但没有一个解决我在这里暴露的右值问题。
【问题讨论】:
-
对于类类型,左值/右值和可分配性是正交的。有些左值是您无法分配的,有些是您可以分配的右值。如果您将左值视为“左侧”而将右值视为“右侧”,请忘记这一点。 C++ 以不同的方式使用术语左值和右值。