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í.