Maison > développement back-end > C++ > Pourquoi « static_assert » se comporte-t-il différemment avec les paramètres de modèle non-type selon les compilateurs ?

Pourquoi « static_assert » se comporte-t-il différemment avec les paramètres de modèle non-type selon les compilateurs ?

Patricia Arquette
Libérer: 2024-11-05 09:02:02
original
993 Les gens l'ont consulté

Why Does `static_assert` Behave Differently with Non-Type Template Parameters Across Compilers?

Comportement incohérent de static_assert avec des paramètres de modèle non-type dans les compilateurs

En C, un static_assert peut être utilisé pour vérifier les conditions au moment de la compilation . Cependant, une observation récente a révélé une disparité dans le comportement de static_assert lorsqu'il est utilisé conjointement avec des paramètres de modèle non-type dans différents compilateurs.

Plus précisément, l'extrait de code suivant :

<code class="cpp">template <int answer>
struct Hitchhiker {
  static_assert(sizeof(answer) != sizeof(answer), "Invalid answer");
};

template <>
struct Hitchhiker<42> {};</code>
Copier après la connexion

se comporte différemment sur Clang et GCC lorsque vous tentez de désactiver l'instanciation générale du modèle à l'aide de static_assert. Clang déclenche l'erreur d'assertion même lorsque le modèle n'est pas instancié, tandis que GCC ne génère l'erreur que lors de l'instanciation avec une valeur de paramètre autre que 42.

Pour comprendre l'écart, explorons la section pertinente de la norme C ( [temp.res]/8) :

If no valid specialization can be generated for a template, and that template is not instantiated, the template is ill-formed, no diagnostic required.
Copier après la connexion

Selon cette règle, le modèle principal Hitchhiker est mal formé puisqu'aucune spécialisation valide ne peut être générée. Il n’est donc pas nécessaire d’émettre un diagnostic. Cependant, Clang choisit de fournir un diagnostic malgré le manque d'exigence.

Si l'intention est de limiter l'instanciation à seulement 42, l'approche recommandée consiste à omettre la définition générale du modèle comme suit :

<code class="cpp">template <>
struct Hitchhiker<42> {};</code>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal