Les constructeurs de modèles de classe peuvent-ils avoir une liste de paramètres de modèle redondants en C 20 ?
En C 17, il était permis de déclarer des constructeurs de modèles de classe avec une liste de paramètres de modèle redondante, comme illustré par le code suivant :
template<typename T> struct S { S<T>(); };
Cependant, avec le l'avènement de C 20 et la mise en œuvre de changements de compatibilité, le code susmentionné génère désormais une erreur sur le tronc GCC (pour -std=c 20). Clang trunk, en revanche, compile le code sans problème. Cette incohérence soulève la question : s'agit-il d'un bug ou d'un changement radical prévu qui n'a pas encore été entièrement implémenté dans les compilateurs ?
La réponse
La réponse réside dans un changement subtil dans la spécification C 20. Plus précisément, la section suivante a été révisée :
[class.ctor]
"Un constructeur est introduit par une déclaration dont le déclarateur est un déclarateur de fonction de la forme :
ptr-declarator ( parameter-declaration-clause ) noexcept-specifier attribute-specifier-seq
Où le déclarateur ptr se compose uniquement d'une expression d'identification, d'un spécificateur-seq d'attribut facultatif et parenthèses facultatives, et l'expression-id a l'une des formes suivantes :"
Dans le cas d'une déclaration de membre dans un modèle de classe, l'expression-id doit maintenant être le nom de classe injecté du immédiatement -entité englobante.
Par conséquent, alors que C 17 autorisait S
Par conséquent, l'erreur rencontrée sur le tronc GCC avec -std=c 20 n'est pas un bug mais une indication de la rupture. changement introduit dans C 20. Les compilateurs qui n'ont pas encore implémenté ce changement continueront à compiler l'ancien code avec succès, tandis que ceux qui l'ont implémenté respecteront la nouvelle exigence.
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!