Maison > développement back-end > C++ > le corps du texte

Pourquoi une assertion statique échoue-t-elle dans une fonction de modèle non appelée ?

Susan Sarandon
Libérer: 2024-11-12 07:58:01
original
967 Les gens l'ont consulté

Why Does a Static Assertion Fail in an Uncalled Template Function?

Échec de Static_Assert malgré une fonction de modèle non appelée

Considérez la fonction de modèle suivante :

template <typename T>
inline T getValue(AnObject&) {
    static_assert(false, "this function has to be implemented for desired type");
}
Copier après la connexion

Lors de la compilation avec g 4.6.3, malgré le fait de ne pas appeler cette fonction n'importe où, la compilation échoue avec l'erreur :

static_assertion failed "this function has to be implemented for the desired type"
Copier après la connexion

Ce comportement peut soulever des questions, car la fonction n'est pas invoquée et ne devrait pas déclencher d'erreur de compilation. Cependant, selon la norme C dans [temp.res]/8 :

If no valid specialization can be generated for a template definition, and that template is not instantiated, the template definition is ill-formed, no diagnostic required.
Copier après la connexion

Comme il n'existe aucun moyen réalisable d'instancier le modèle de fonction avec une spécialisation valide qui compilerait, la définition du modèle elle-même est considérée mal formé. Cela permet au compilateur de le rejeter avant même qu'une instanciation ne se produise.

Pour résoudre ce problème et permettre une détection d'erreur retardée, la fonction de modèle peut être modifiée comme suit :

template <typename T>
struct foobar : std::false_type {
};

template <typename T>
inline T getValue(AnObject&) {
    static_assert(foobar<T>::value, "this function has to be implemented for desired type");
}
Copier après la connexion

En utilisant un modèle supplémentaire struct foobar comme indicateur de compilation, le compilateur ne peut pas immédiatement rejeter le modèle de fonction. Une fois instanciée, la spécialisation pertinente de foobar déterminera si l'assertion statique doit échouer, comme prévu.

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal