Évaluation du comportement de static_assert dans l'instanciation de modèle
Dans ce code, un static_assert est utilisé pour valider la valeur du paramètre de modèle non-type répondre. Cependant, le comportement de cette assertion varie entre gcc et clang :
<code class="cpp">template <int answer> struct Hitchhiker { static_assert(sizeof(answer) != sizeof(answer), "Invalid answer"); }; template <> struct Hitchhiker<42> {};</code>
Comportement de gcc :
gcc ne déclenche l'assertion que lors de l'instanciation d'Hitchhiker avec un paramètre autre que 42.
Comportement de clang :
clang génère l'erreur d'assertion même si le modèle n'est pas explicitement instancié.
Interprétation standard :
Le standard C stipule que si un modèle n'a pas de spécialisations valides et n'est pas instancié, le modèle est considéré comme mal formé. Cela signifie qu'aucun diagnostic n'est requis.
Analyse :
Les deux compilateurs ont un comportement correct. Clang choisit de fournir un diagnostic même si la norme ne l'exige pas.
Approche alternative :
Pour permettre uniquement une réponse de 42, le modèle général peut être omis , et le modèle spécialisé défini 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!