Maison > développement back-end > C++ > Pourquoi `static_assert` avec des paramètres de modèle non-type se comporte-t-il différemment dans GCC et Clang ?

Pourquoi `static_assert` avec des paramètres de modèle non-type se comporte-t-il différemment dans GCC et Clang ?

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

Why Does `static_assert` with Non-Type Template Parameters Behave Differently in GCC and Clang?

Assert statique avec paramètre de modèle non-type

En C , static_assert est utilisé pour vérifier les conditions au moment de la compilation. Cependant, différents compilateurs présentent des comportements variables lors de l'utilisation de static_assert avec des paramètres de modèle non-type.

Problème :

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

produit des résultats différents lorsqu'il est compilé à l'aide de GCC et Clang. Dans GCC, l'erreur d'assertion n'est générée que lors de l'instanciation de Hitchhiker avec un paramètre autre que 42. Dans Clang, l'erreur d'assertion est générée même lorsque le modèle n'est pas instancié.

Modifier l'assertion comme suit :

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

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

aboutit à un comportement cohérent entre les deux compilateurs, l'assertion n'étant vérifiée que lors de l'instanciation du modèle.

Réponse :

Selon la norme C ( [temp.res]/8), un modèle non instancié sans spécialisations valides est considéré comme mal formé, sans nécessiter de diagnostic.

Conclusion :

Dans Dans le cas du code d'origine, GCC choisit de ne pas émettre de diagnostic pour le modèle non instancié. Clang, quant à lui, décide d'émettre un diagnostic même si la norme ne l'exige pas. Le comportement du code modifié est plus cohérent entre les compilateurs car l'assertion n'est vérifiée que lorsque le modèle est réellement instancié.

Il est important de noter que la présence ou l'absence d'un diagnostic dans ce scénario n'indique pas une erreur dans le code. Le modèle non instancié est intrinsèquement mal formé et toute tentative de l'instancier avec une spécialisation non valide entraînera une erreur de compilation.

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