Maison >développement back-end >C++ >Pourquoi GCC et Clang diffèrent-ils dans le comportement des assertions statiques pour les modèles non instanciés ?

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

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-04 19:20:01823parcourir

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>

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>

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.

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>

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