web-dev-qa-db-fra.com

quel est le type de retour de l'opérateur d'affectation?

Je commence juste C++. Je suis un peu confus quant au type de retour de l'opérateur d'affectation et de déréférence. Je suis le livre C++ Primer. À plusieurs reprises, l'auteur dit que le type de retour de l'opérateur d'affectation fait référence au type d'opérande de gauche mais plus tard, il dit que le type de retour est le type de l'opérande de gauche. J'ai référé C++ 11 Standard Sec. 5.17, où le type de retour est décrit comme "lvalue se référant à l'opérande de gauche".

De même, je ne peux pas déterminer si la déréférence renvoie l'objet pointé ou la référence à l'objet.

Ces déclarations sont-elles équivalentes? Si oui, alors comment? Toute explication serait appréciée.

28
oczkoisse

La norme définit correctement le type de retour d'un opérateur d'affectation. En fait, l'opération d'affectation elle-même ne dépend pas de la valeur de retour - c'est pourquoi le type de retour n'est pas simple à comprendre.

Le type de retour est important pour les opérations de chaînage. Considérez la construction suivante: a = b = c;. Cela doit être égal à a = (b = c), c'est-à-dire c doit être affecté à b et b à a. Réécrivez ceci comme a.operator=(b.operator=(c)). Pour que l'affectation dans a fonctionne correctement, le type de retour de b.operator=(c) doit faire référence au résultat de l'affectation interne (cela fonctionnera également avec la copie, mais ce n'est qu'une surcharge inutile).

Le type de retour de l'opérateur de déréférence dépend de votre logique interne, définissez-le de la manière qui convient à vos besoins.

27

Ils peuvent tous les deux être n'importe quoi, mais généralementoperator = renvoie l'objet actuel par référence, c'est-à-dire.

A& A::operator = ( ... )
{
   return *this;
}

Et oui, "référence au type d'opérande de gauche" et "lvalue se référant à l'opérande de gauche" signifient la même chose.

L'opérateur de déréférence peut avoir pratiquement n'importe quel type de retour. Cela dépend principalement de la logique du programme, car vous surchargez l'opérateur qui s'applique à un objet, pas à un pointeur sur l'objet. Habituellement, cela est utilisé pour les pointeurs intelligents ou les itérateurs et retourne l'objet qu'ils entourent:

struct smart_ptr
{
   T* innerPtr;
   T* smart_ptr::operator* ()
   {
      return innerPtr;
   }
}

smart_ptr p; 
T* x = *p;  
9
Luchian Grigore

J'ai vu des problèmes similaires, mais je pense qu'il serait préférable d'utiliser

X& X::operator=(const X&);

En utilisant cela, vous pourrez réutiliser l'objet dans une affectation en chaîne.

1
bash.d