Le point est que pour les types de classe (mais pas pour builtin types), a = b
est juste une abréviation pour a.operator=(b)
, où l'opérateur= est une fonction membre. Et des fonctions de membre peut être appelé sur rvalues ces (a * b)
créé par Rational::operator*
. Pour appliquer similaire sémantique que pour builtin rvalues ("faire comme les services de renseignements n'"), certains auteurs (Meyers y compris) a recommandé en C++98, pour les retours par const-rvalue pour les classes avec de tels opérateurs.
Toutefois, en C++11, retour par const-rvalue est une mauvaise idée car il va inhiber la sémantique de déplacement, car const rvalues ne peut pas se lier T&&
.
Dans ses notes, Un aperçu de la nouvelle C++ (C++11), Scott Meyers donne exactement le même exemple de son vieux livre, et conclut qu'il est maintenant considéré comme une mauvaise conception pour ajouter la const valeur de retour. Le recommandé signature est maintenant
Rational operator*(const Rational& lhs, const Rational& rhs);
Mise à JOUR: Comme le sous-entend @JohannesSchaub-litb dans les commentaires, en C++11, vous pouvez également utiliser un qualificatif de référence sur l'opérateur d'affectation, de sorte qu'il n'acceptera que des lvalues comme sa gauche argument (c'est à dire l' *this
pointeur, c'est pourquoi cette fonction est également connu comme "références rvalue pour *ce"). Vous aurez besoin de g++ >= 4.8.1 (vient de sortir) ou Clang >= 2,9 à en faire usage.