"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Pourquoi « static_assert » se comporte-t-il différemment avec les paramètres de modèle non-type selon les compilateurs ?

Pourquoi « static_assert » se comporte-t-il différemment avec les paramètres de modèle non-type selon les compilateurs ?

Publié le 2024-11-09
Parcourir:768

Why Does `static_assert` Behave Differently with Non-Type Template Parameters Across Compilers?

Comportement incohérent de static_assert avec les 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 :

template 
struct Hitchhiker {
  static_assert(sizeof(answer) != sizeof(answer), "Invalid answer");
};

template 
struct Hitchhiker {};

se comporte différemment sur Clang et GCC lors de la tentative de désactivation de 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 :

template 
struct Hitchhiker {};
Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3