Maison > développement back-end > C++ > le corps du texte

Pourquoi GCC et Clang diffèrent-ils dans le comportement des assertions statiques pour les modèles non instanciés ?

Mary-Kate Olsen
Libérer: 2024-11-04 19:20:01
original
731 Les gens l'ont consulté

Why Do GCC and Clang Differ in Static Assert Behavior for Uninstantiated Templates?

Différence de comportement des assertions statiques entre GCC et Clang

Dans la programmation de modèles, il est possible d'appliquer certaines conditions au moment de la compilation à l'aide d'assertions statiques. Cependant, différents compilateurs peuvent présenter des variations dans leur comportement lors de l'évaluation de ces assertions, comme l'illustre une observation récente.

Considérez 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

Dans cet exemple, nous essayons de utilisez une assertion statique pour désactiver l'instanciation générale du modèle pour Hitchhiker. Cependant, lors de la compilation, il est noté que clang génère une erreur d'assertion même lorsque le modèle n'est pas instancié, alors que gcc ne génère l'erreur que lors de l'instanciation de Hitchhiker avec un paramètre autre que 42.

Une enquête plus approfondie a révélé que cette divergence provient à partir du morceau de code suivant :

<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

Lors de la compilation avec ce code modifié, les deux compilateurs présentent le même comportement : l'assertion n'est déclenchée que lorsque le modèle général est instancié. Ce comportement est conforme au standard C, comme spécifié dans [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 ce passage, s'il n'est pas possible de générer une spécialisation valide pour un modèle et qu'il n'est pas instancié, le modèle est considéré comme mal formé et ne nécessite aucun diagnostic. Dans ce cas, clang choisit de fournir un diagnostic, contrairement à gcc.

Pour appliquer la restriction afin d'autoriser uniquement 42, une approche consiste à s'abstenir de définir le modèle général :

<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
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!