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