Maison > développement back-end > C++ > La liste des paramètres de modèle redondants dans les constructeurs de modèles de classe C 20 est-elle autorisée ?

La liste des paramètres de modèle redondants dans les constructeurs de modèles de classe C 20 est-elle autorisée ?

DDD
Libérer: 2024-11-26 06:54:10
original
829 Les gens l'ont consulté

Is Redundant Template Parameter Listing in C  20 Class Template Constructors Allowed?

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

La validité des constructeurs de modèles de classe ayant des listes de paramètres de modèle redondantes a été débattue depuis l'introduction du C 20. Voici le problème et sa résolution :

En C 17, le code ci-dessous était considéré comme bien formé :

template<typename T>
struct S {
    S<T>();
};
Copier après la connexion

Cependant, en C 20, le même code déclenche une erreur dans certains compilateurs (par exemple, gcc trunk) sous -std=c 20 :

error: expected unqualified-id before ')' token
    3 |     S<T>();
                 ^
Copier après la connexion

Changement en C 20

La norme C 20 impose un changement dans la syntaxe des déclarations du constructeur de modèles de classe. Le delta suivant dans la section de compatibilité de la norme met en évidence ceci :

[diff.cpp17.class]

...

Change: A simple-template-id is no longer valid as the declarator-id of a constructor or destructor.
Rationale: Remove potentially error-prone option for redundancy.
...
Copier après la connexion

Essentiellement, la liste de paramètres de modèle "redondants", S(), utilisée dans le code précédent n'est plus autorisée. Au lieu de cela, le nom de classe injecté, S, doit être utilisé :

template<typename T>
struct S {
    S(); // CORRECT C++20 syntax
};
Copier après la connexion

Raison d'être

La justification de ce changement est de réduire le risque d'erreurs en interdisant le utilisation d’identifiants de modèles simples. En imposant l'utilisation explicite du nom de classe injecté, le compilateur peut résoudre plus précisément le constructeur prévu.

Conclusion

Ce changement dans C 20 ne constitue pas un bug , mais plutôt un changement radical intentionnel pour améliorer la clarté et l'exactitude des déclarations du constructeur de modèle de classe. Bien que cela puisse entraîner des problèmes de compatibilité avec le code existant reposant sur la syntaxe précédente, cela améliore en fin de compte la sécurité et la fiabilité globales des applications C.

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!

source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal