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!