Certains opérateurs de retour par valeur, par référence. En général, un opérateur dont le résultat est une nouvelle valeur (tels que +, -, etc) doit retourner à la nouvelle valeur en valeur, et d'un opérateur dont le résultat est une valeur existante, mais modifiées (comme <<, >>, +=, -=, etc), doit retourner une référence à la valeur modifiée.
Par exemple, cout
est std::ostream
, et l'insertion de données dans le flux de données est une modification de l'opération, afin de mettre en œuvre l' <<
opérateur à insérer dans un ostream
, l'opérateur est défini comme ceci:
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;
}
De cette façon, lorsque vous avez une instruction composée, comme cout << x << y
, la sous-expression cout << x
est évalué en premier, puis l'expression [result of cout << x ] << y
est évaluée. Depuis l'opérateur <<
sur x
renvoie une référence à l' cout
, l'expression [result of cout << x ] << y
est équivalent à cout << y
, comme prévu.
A l'inverse, pour "chaîne + chaîne", le résultat est une nouvelle chaîne (les deux chaînes d'origine sont inchangés), de sorte qu'il doit retourner en valeur (sinon vous seriez de retour d'une référence à un emploi temporaire, ce qui est un comportement indéfini).