Come può essere assegnabile un oggetto restituito?
Domanda
In Effective C ++, elemento 3, Scott Meyers suggerisce di sovraccaricare operator*
per una classe denominata Rational
:
class Rational { ... };
const Rational operator*(const Rational& lhs, const Rational& rhs);
Il motivo per cui il valore restituito è qualificato da const
è spiegato nella riga seguente: se non fosse const
, i programmatori potrebbero scrivere codice come:
(a * b) = c;
o, più probabilmente:
if (a*b = c)
Abbastanza giusto. Ora sono confuso perché pensavo che il valore di ritorno di una funzione, qui operatore *, fosse un rvalue, quindi non assegnabile.Presumo che non sia assegnabile perché se avessi:
int foo();
foo() += 3;
che non riuscirebbe a compilare con invalid lvalue in assignment
.
Perché non succede qui?Qualcuno può far luce su questo?
MODIFICA : ho visto molti altri thread su quell'articolo di Scott Meyers, ma nessuno ha affrontato il problema del valore che ho esposto qui.
Soluzione
Il punto è che per i tipi di classe, a = b
è solo una scorciatoia per a.operator=(b)
, dove operator=
è una funzione membro.E le funzioni membro possono essere chiamate su rvalues.
Nota che in C ++ 11 puoi inibirlo rendendo operator=
solo lvalue:
class Rational
{
public:
Rational& operator=(Rational const& other) &;
// ...
};
Il &
dice al compilatore che questa funzione potrebbe non essere chiamata su rvalues.