c++ const rvalue

c++ - ¿Cómo puede un objeto devuelto ser asignable?



const rvalue (1)

El punto es que para los tipos de clase, a = b es solo una abreviatura de a.operator=(b) , donde operator= es una función miembro. Y las funciones miembro pueden ser llamadas en valores.

Tenga en cuenta que en C ++ 11 puede inhibir eso haciendo que operator= lvalue-only:

class Rational { public: Rational& operator=(Rational const& other) &; // ... };

El & le dice al compilador que esta función no puede ser llamada en rvalues.

En el artículo 3 efectivo de C ++, Scott Meyers sugiere un operator* sobrecarga operator* para una clase llamada Rational :

class Rational { ... }; const Rational operator*(const Rational& lhs, const Rational& rhs);

La razón por la cual el valor de retorno está const cualificado se explica en la siguiente línea: si no fuera const , los programadores podrían escribir código como:

(a * b) = c;

o, más probablemente:

if (a*b = c)

Lo suficientemente justo. Ahora estoy confundido porque pensé que el valor de retorno de una función, aquí el operador *, era un valor r, por lo tanto, no asignable. Supongo que no es asignable porque si tuviera:

int foo(); foo() += 3;

eso fallaría compilar con invalid lvalue in assignment . ¿Por qué no sucede eso aquí? ¿Alguien puede arrojar algo de luz sobre esto?

EDITAR : He visto muchos otros hilos en ese artículo de Scott Meyers, pero ninguno abordó el problema del valor que expuse aquí.