Maison >développement back-end >C++ >Quand le compilateur remplace-t-il « Type & » dans les opérateurs de conversion C ?

Quand le compilateur remplace-t-il « Type & » dans les opérateurs de conversion C ?

DDD
DDDoriginal
2024-11-16 05:11:02404parcourir

When Does the Compiler Substitute `Type&` in C   Conversion Operators?

Comprendre les opérateurs de conversion en C

Dans le domaine de la programmation orientée objet, les opérateurs de conversion jouent un rôle crucial en comblant le fossé entre les différents types de données. Ces opérateurs permettent à un objet d'être traité comme un autre type, élargissant ainsi sa convivialité.

Considérez l'exemple suivant pour illustrer le fonctionnement des opérateurs de conversion :

template <class Type>
class smartref {
public:
    smartref() : data(new Type) { }
    operator Type&() { return *data; }
private:
    Type* data;
};

class person {
public:
    void think() { std::cout << "I am thinking"; }
};

int main() {
    smartref<person> p;
    p.think(); // why does not the compiler try substituting Type&?
}

Dans cet exemple, une classe smartref est définie comme une classe de modèle, qui peut contenir une instance de n'importe quel type Type. L'opérateur de conversion Type&() est implémenté pour convertir l'objet smartref en référence Type sous-jacente.

Lorsque le compilateur remplace Type&

Le compilateur remplacera Type& dans le opérateur de conversion dans les circonstances suivantes :

  • Passer un argument : Lorsqu'un objet est passé en argument à une fonction, le compilateur peut remplacer Type& si la fonction accepte une référence à Type .
  • Liaison de référence : Lorsqu'une référence est directement liée à un objet, le compilateur peut remplacer Type& si l'objet est une lvalue.
  • Conversion de pointeur de fonction : Lorsqu'un objet est converti en pointeur de fonction ou en référence, le compilateur peut remplacer Type& si le pointeur de fonction ou la référence correspond à la signature de la fonction de conversion.
  • Conversion de type hors classe : Le compilateur peut utiliser des fonctions de conversion définies par l'utilisateur pour convertir des objets en types non-classes, tels que des valeurs booléennes ou des pointeurs.
  • Opérateurs de conversion de modèle : Les opérateurs de conversion de modèle permettent aux objets de être convertible en n’importe quel type de pointeur. Cependant, la prudence est de mise lors de l'utilisation de ces opérateurs car ils peuvent conduire à une ambiguïté.

Dans le cas de l'exemple fourni, le compilateur ne substitue pas Type& dans l'appel de fonction think() car il est appelé sur un objet de type smartref, qui n'est pas une référence lvalue à Type&.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn