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