Alcuni operatori restituiscono per valore, alcuni per riferimento. In generale, un operatore il cui risultato è un nuovo valore (come +, -, ecc) deve restituire il nuovo valore per valore e un operatore il cui risultato è un valore esistente, ma modificato (ad esempio < <, >>, + =, - =, ecc), dovrebbe restituire un riferimento al valore modificato.
Ad esempio, cout
è un std::ostream
, e l'inserimento dei dati nel flusso è un'operazione modifica, in modo da implementare all'operatore <<
da inserire in un ostream
, l'operatore è definito così:
std::ostream& operator<< (std::ostream& lhs, const MyType& rhs)
{
// Do whatever to put the contents of the rhs object into the lhs stream
return lhs;
}
Questo modo, quando si dispone di un'istruzione composta come cout << x << y
, viene valutata prima la sottoespressione cout << x
, quindi viene valutata l'espressione [result of cout << x ] << y
. Poiché l'operatore <<
su x
restituisce un riferimento a cout
, l'espressione [result of cout << x ] << y
equivale a cout << y
, come previsto.
Al contrario, per "stringa + stringa", il risultato è una nuova stringa (entrambe le stringhe originali sono invariate), quindi deve restituire per valore (altrimenti si restituirebbe un riferimento a un temporaneo, che è un comportamento non definito) .
fonte
2010-02-25 20:08:54
Che va di pari passo con "se è const, restituisce un valore, se non è const, restituisce un riferimento". – GManNickG
Tecnicamente '<<' non modifica il valore esistente. È solo un operatore del turno di sinistra. È l'interfaccia del flusso che infrange le regole. – kennytm
@GMan corretto, anche se questo non copre i casi (come 'operatore <<') dove il sovraccarico viene implementato come non membro. –