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>(); };
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>(); ^
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. ...
Essentiellement, la liste de paramètres de modèle "redondants", S
template<typename T> struct S { S(); // CORRECT C++20 syntax };
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!