Maison >développement back-end >C++ >Les constructeurs de modèles de classe C 20 peuvent-ils omettre les listes de paramètres de modèles redondants ?

Les constructeurs de modèles de classe C 20 peuvent-ils omettre les listes de paramètres de modèles redondants ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-19 15:12:03400parcourir

Can C  20 Class Template Constructors Omit Redundant Template Parameter Lists?

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() comme déclaration de constructeur dans le modèle S, C 20 nécessite S() à la place. Ce changement supprime efficacement la redondance et s'aligne sur le CWG 2237, qui traite des pratiques potentiellement sujettes aux erreurs.

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!

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