Maison >développement back-end >C++ >Pourquoi ne puis-je pas appeler explicitement des constructeurs de modèles dans les listes d'initialisation C ?

Pourquoi ne puis-je pas appeler explicitement des constructeurs de modèles dans les listes d'initialisation C ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-29 15:12:11966parcourir

Why Can't I Explicitly Invoke Template Constructors in C   Initializer Lists?

Invocation explicite de constructeurs de modèles dans les listes d'initialisation

En C , il n'est pas possible d'invoquer explicitement un constructeur de modèle dans une liste d'initialisation. Prenons l'exemple suivant :

struct T { 
    template<class> T();
};

struct U {
    U() : t<void>() {} //does not work
    T t;
};

Ce code ne pourra pas être compilé, car la norme C interdit explicitement les listes d'arguments de modèle explicites pour les modèles de fonctions membres du constructeur. Cela est dû à la syntaxe unique des constructeurs, qui n'ont pas de nom de fonction.

Explication : La norme C indique dans la section 14.8.1/7 :

"Étant donné que la liste d'arguments de modèle explicite suit le nom du modèle de fonction et que les modèles de fonctions membres de conversion et les modèles de fonctions membres de constructeur sont appelés sans utiliser de nom de fonction, il n'existe aucun moyen de fournir un argument explicite. liste d'arguments de modèle pour ces modèles de fonctions. qui accepte les paramètres du modèle comme argument :

Dans ce cas, le type d'identité de la bibliothèque Boost ou le std::type_identity de C 20 peut être utilisé pour représenter le type de paramètre du modèle. Cela permet au constructeur de modèle d'être invoqué indirectement à l'aide d'un objet de ce type personnalisé.

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