C++ 返回的对象如何可赋值? :类的重载操作符*/COD> class Rational { ... }; const Rational operator*(const Rational& lhs, const Rational& rhs);
返回值被C++ 返回的对象如何可赋值? :类的重载操作符*/COD> class Rational { ... }; const Rational operator*(const Rational& lhs, const Rational& rhs);,c++,constants,rvalue,C++,Constants,Rvalue,返回值被const-限定的原因在下面一行中解释:如果它不是const,程序员可以编写如下代码: (a * b) = c; 或者,更可能是: if (a*b = c) 很公平。 现在我很困惑,因为我认为函数的返回值,这里的运算符*,是一个右值,因此不可赋值。我认为它不可转让,因为如果我有: int foo(); foo() += 3; 如果赋值中的左值无效,则编译失败。 为什么这里不发生这种事?有人能解释一下吗 EDIT:我在Scott Meyers的这一项
const
-限定的原因在下面一行中解释:如果它不是const
,程序员可以编写如下代码:
(a * b) = c;
或者,更可能是:
if (a*b = c)
很公平。
现在我很困惑,因为我认为函数的返回值,这里的运算符*,是一个右值,因此不可赋值。我认为它不可转让,因为如果我有:
int foo();
foo() += 3;
如果赋值中的左值无效,则编译失败。
为什么这里不发生这种事?有人能解释一下吗
EDIT:我在Scott Meyers的这一项上看到了许多其他的线程,但是没有一个线程解决我在这里暴露的右值问题。关键是,对于类类型,a=b
只是a.operator=(b)
的简写,其中operator=
是一个成员函数。成员函数可以在右值上调用
请注意,在C++11中,您可以通过仅使运算符=
左值来禁止该操作:
class Rational
{
public:
Rational& operator=(Rational const& other) &;
// ...
};
&
告诉编译器不能对右值调用此函数。或者换句话说,*运算符返回一个临时对象。就像,比方说,一个独立的Rational()
,可以用作左值。另外,对于可分配的返回值,至少有一个合法的用例:操作符[]。如果不能提供一个与数组索引器不同的重载,那就太奇怪了。@TamásSzelei:operator[]通常返回对对象的引用,该对象是左值,因此这不适用。但是,有时会返回一个代理对象(例如,允许多个索引),在这种情况下确实需要对右值赋值。@MrLister:No,Rational()
不是左值。例如,您不能获取其地址(除非显式重载运算符的地址,在这种情况下,它又只是一个成员函数调用)。@MrLister:不,您不能写入void*p=&Rational()无需编写自己的操作符&
。只要问问你的编译器。更重要的是,不能将其传递给采用非常量左值引用的函数。对于类类型,左值/右值和可赋值性是正交的。有些左值不能指定给,有些右值可以指定给。如果你认为左值是“左边”而右值是“右边”,那就忘掉它吧。C++使用不同的方式使用LValk和RValk。