Maison  >  Article  >  développement back-end  >  Pourquoi les listes de paramètres de modèle redondantes dans les constructeurs de modèles de classe C 20 sont-elles désormais une erreur ?

Pourquoi les listes de paramètres de modèle redondantes dans les constructeurs de modèles de classe C 20 sont-elles désormais une erreur ?

DDD
DDDoriginal
2024-11-19 06:32:02465parcourir

Why Are Redundant Template Parameter Lists in C  20 Class Template Constructors Now an Error?

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

En C , la syntaxe de déclaration des constructeurs dans les modèles de classe a subi une modification en C 20. Auparavant, le code de la forme suivante était considéré comme bien formé :

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

Malgré la redondance du paramètre de modèle dans la déclaration du constructeur, ce code a été compilé avec succès. Cependant, en C 20 avec l'indicateur -std=c 20 activé, le tronc GCC signale désormais une erreur pour ce code :

error: expected unqualified-id before ')' token
3 |     S<T>();
^

Bien que cette erreur ne soit pas rencontrée dans GCC10.2 ou Clang avec -std= c 20, il découle d'un changement fondamental introduit dans C 20.

Selon la section de compatibilité C 20, l'utilisation d'un simple-template-id comme déclarant-id pour un constructeur ou un destructeur n'est plus valide. Cette décision vise à éliminer les redondances potentielles sujettes aux erreurs.

Le nouveau libellé de la section [class.ctor] de C 20 spécifie que pour les constructeurs dans les déclarations de membres dans les modèles de classe, le nom de classe injecté doit être utilisé à la place. :

template<typename T>
struct S {
    S();  // Use injected-class-name
};

Dans cet exemple, S représente le nom de classe injecté pour le modèle de classe interne. Par conséquent, le Le paramètre de modèle est supprimé de la déclaration du constructeur.

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