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>
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.
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>
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!