在Effective C++的第3项中,Scott Meyer建议为名为Rational
的类重载operator*
class Rational { ... };
const Rational operator*(const Rational& lhs, const Rational& rhs);
下面一行解释了返回值为const
-qualified的原因:如果返回值不是const
,程序员可以编写如下代码:
(a * b) = c;
或者,更可能的是:
if (a*b = c)
当然可以。现在我很困惑,因为我认为一个函数的返回值,这里的运算符*,是一个右值,因此是不可赋值的。我认为它是不可分配的,因为如果我有:
int foo();
foo() += 3;
这将无法使用invalid lvalue in assignment
进行编译。为什么不在这里发生呢?谁能解释一下这件事?
编辑:我见过许多关于Scott Meyer项目的其他帖子,但都没有解决我在这里暴露的右值问题。
发布于 2012-01-12 17:01:18
重点在于,对于类类型,a = b
只是a.operator=(b)
的简写,其中operator=
是一个成员函数。并且可以在右值上调用成员函数。
请注意,在C++11中,您可以通过将operator=
设置为仅限左值来抑制这一点:
class Rational
{
public:
Rational& operator=(Rational const& other) &;
// ...
};
&
告诉编译器这个函数不能在右值上调用。
https://stackoverflow.com/questions/8832304
复制相似问题