Maison >développement back-end >C++ >Pourquoi ne puis-je pas appeler explicitement un constructeur de modèle dans une liste d'initialisation C ?

Pourquoi ne puis-je pas appeler explicitement un constructeur de modèle dans une liste d'initialisation C ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-18 03:56:09455parcourir

Why Can't I Explicitly Invoke a Template Constructor in a C   Initializer List?

Invocation explicite d'un constructeur de modèle en C

En C , il n'est pas possible d'invoquer explicitement un constructeur de modèle dans une liste d'initialisation. Cela est dû à la syntaxe spécifique utilisée pour les arguments du modèle, qui suivent le nom du modèle de fonction plutôt que d'être inclus entre parenthèses lors de la construction.

Comme indiqué dans la norme C (14.8.1/7) :

[Remarque : é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 de modèle explicite. liste de ces modèles de fonctions. ]

Par conséquent, l'exemple suivant ne fonctionnera pas :

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

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

Dans ce cas, le compilateur tentera d'interpréter t comme type de classe de base et ne parviendra pas à trouver un constructeur par défaut correspondant.

Solution de contournement

Pour contourner cette limitation, on peut utiliser un modèle de fonction qui prend un type d'identité comme argument :

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

struct U {
    U() : t(identity<void>()) {}
    T t;
};

Étant donné la définition suivante de l'identité de Boost :

template<typename T> struct identity { typedef T type; };

ou, en C 20, en utilisant std::type_identity:

using ::std::type_identity;

cette approche permet effectivement de transmettre des arguments de modèle aux constructeurs dans les listes d'initialisation.

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