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

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

Barbara Streisand
Barbara Streisandoriginal
2024-11-28 02:10:10386parcourir

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

Suppression des listes de paramètres de modèle redondants dans les constructeurs de modèles de classe en C 20

En C 17, il était acceptable que les constructeurs de modèles de classe aient listes de paramètres de modèle redondantes. Par exemple :

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

Or, en C 20, ce n'est plus le cas. Un changement récent exige que tous les constructeurs de modèles de classe utilisent le nom de classe injecté, ce qui élimine la redondance dans le déclarateur.

Cette modification est documentée dans la section de compatibilité du projet C 20 :

[diff.cpp17.class]
**Affected subclauses**: [class.ctor] and [class.dtor]
**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.
**Effect on original feature**: Valid C++ 2017 code may fail to compile in this International Standard.

Plus précisément, l'expression id dans le déclarateur du constructeur doit maintenant prendre l'un des éléments suivants form :

  • Dans une déclaration de membre dans une spécification de membre non-ami d'une classe, le nom de classe injecté de la classe englobante.
  • Dans une déclaration de membre dans un non-ami -friend spécification de membre d'un modèle de classe, le nom de classe nommant l'instanciation actuelle du modèle de classe englobant.

Par conséquent, le bon la déclaration du constructeur en C 20 est simplement :

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

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