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 en C 0x ?

Mary-Kate Olsen
Libérer: 2024-11-06 16:42:03
original
147 Les gens l'ont consulté

Why Does a Static Assert Fail in an Uncalled Template Function in C  0x?

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

En C 0x, les modèles avec des déclarations static_assert inutilisées peuvent entraîner des échecs de compilation. Considérez le code suivant :

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

Étonnamment, ce code échoue avec l'erreur :

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

Intuitivement, on pourrait s'attendre à ce que le compilateur instancie la fonction modèle uniquement si elle est appelée. Cependant, le standard C précise autrement dans [temp.res]/8 :

Aucun diagnostic ne doit être émis pour une définition de modèle pour laquelle une spécialisation valide peut être générée. Si aucune spécialisation valide ne peut être générée pour une définition de modèle et que ce modèle n'est pas instancié, la définition de modèle est mal formée et aucun diagnostic n'est requis.

Comme il n'existe aucune spécialisation valide qui compile, le compilateur est autorisé de rejeter la définition du modèle qu'il soit instancié ou non.

Pour résoudre ce problème, on peut redéfinir le code 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 the desired type");
}
Copier après la connexion

Cette modification reporte le diagnostic à l'instanciation du foobar spécialisation, en garantissant que la définition du modèle est bien formée d'ici là.

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
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!