在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的那篇文章中看到了许多其他主题,但没有人解决我在这里曝光的右值问题。
答案 0 :(得分:30)
关键是,对于班级类型,a = b
只是a.operator=(b)
的简写,其中operator=
是成员函数。并且可以在rvalues上调用成员函数。
请注意,在C ++ 11中,您可以通过仅operator=
左值来禁止它:
class Rational
{
public:
Rational& operator=(Rational const& other) &;
// ...
};
&
告诉编译器可能不会在rvalues上调用此函数。