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。