Maison >développement back-end >C++ >Pourquoi le compilateur ne remplace-t-il pas le type dans les opérateurs de conversion ?

Pourquoi le compilateur ne remplace-t-il pas le type dans les opérateurs de conversion ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-15 20:32:02561parcourir

Why Doesn't the Compiler Substitute Type in Conversion Operators?

Comprendre les opérateurs de conversion en C

Considérez l'extrait de code suivant :

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 doesn't the compiler try substituting Type?
}

En C, les opérateurs de conversion jouent un rôle crucial dans les conversions de types. Alors, comment ça marche ?

1. Conversion lors du passage de l'argument :

Les opérateurs de conversion sont pris en compte lors du passage de l'argument, en suivant les règles d'initialisation de la copie. Ils convertissent le type source en n'importe quel type compatible, que la conversion soit en référence ou non.

2. Conversion en référence :

La conversion en référence est autorisée dans l'opérateur conditionnel si le type converti est une lvalue. De plus, lier directement une référence peut également impliquer une conversion en référence.

3. Conversion en pointeurs de fonction :

Les conversions définies par l'utilisateur en pointeurs de fonction ou en références sont utilisées lors des appels de fonction.

4. Conversion en types non-classe :

Les conversions implicites, telles que celles en booléen, peuvent utiliser des fonctions de conversion définies par l'utilisateur.

5. Modèle de fonction de conversion :

Les modèles peuvent être utilisés pour créer des fonctions de conversion qui convertissent un type en n'importe quel type de pointeur (à l'exception des pointeurs membres).

Pourquoi le compilateur ne Remplacer le type ?

Dans l'exemple donné, le compilateur ne remplace pas le type car l'opérateur de conversion dans smartref renvoie un pointeur vers le membre de données interne. Lorsqu'il essaie d'appeler think(), le compilateur déduit que p est un pointeur vers un objet personne, et non une référence à un objet personne. Par conséquent, il n’effectue aucune substitution de type explicite.

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