Maison >développement back-end >C++ >Comment déclarer correctement les constructeurs de modèles de classe en C 20 ?

Comment déclarer correctement les constructeurs de modèles de classe en C 20 ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-25 18:00:191031parcourir

How to Correctly Declare Class Template Constructors in C  20?

Surmonter les paramètres de modèle redondants dans les constructeurs de modèles de classe en C 20

En C 20, la déclaration des constructeurs de modèles de classe a subi une modification subtile mais changement impactant. Auparavant, les constructeurs de modèles de classe pouvaient éventuellement inclure la liste de paramètres de modèle dans leur déclarateur, comme le montre l'extrait de code suivant :

template<typename T>
struct S {
    S<T>();
};

Cette pratique, cependant, est désormais obsolète en C 20. Le code ci-dessus entraîne maintenant une erreur du compilateur dans le tronc gcc avec -std=c 20. Cependant, il serait toujours compilé dans le tronc clang avec le même standard.

Justification du changement

La suppression des paramètres de modèle redondants dans les constructeurs de modèles de classe résout une source potentielle d'erreurs. En exigeant l'utilisation explicite du nom de classe injecté, l'intention simple est préservée lors de la déclaration des constructeurs dans les modèles de classe.

Effet sur le code existant

Ce changement peut avoir implications pour les bases de code existantes qui s'appuient sur la syntaxe précédemment valide. Le code C 2017 valide comme l'exemple ci-dessus peut ne plus être compilé selon la norme C 20.

Résolution du code concerné

Pour tenir compte de ce changement, la syntaxe alternative suivante peut être utilisé :

template<typename T>
struct S {
    S();  // Constructor declaration using the injected class name
};

Alternativement, si des arguments de modèle spécifiques sont requis, la surcharge du constructeur peut être employé :

template<typename T>
struct S {
    S<T>();  // Constructor declaration with explicit template arguments
    S<int>();  // Overload for specific template argument
};

En adhérant à ces directives de syntaxe, les bases de code peuvent maintenir la compatibilité avec la norme C 20 mise à jour.

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