Maison > développement back-end > C++ > Pourquoi une assertion statique échoue-t-elle à la compilation malgré un appel de fonction nulle ?

Pourquoi une assertion statique échoue-t-elle à la compilation malgré un appel de fonction nulle ?

Barbara Streisand
Libérer: 2024-11-06 00:09:02
original
359 Les gens l'ont consulté

Why Does a Static Assertion Fail Compilation Despite a Null Function Invocation?

L'assertion statique échoue à la compilation malgré l'invocation de fonction nulle

En utilisant g 4.6.3 avec l'indicateur c 0x, les développeurs ont rencontré une erreur de compilation inattendue :

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

Résultats en :

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

Cette erreur se produit même si la fonction n'est invoquée nulle part dans le code.

Explication

Selon le standard C [temp.res]/8, si aucune spécialisation valide ne peut être générée pour une définition de modèle qui n'est pas instanciée, le modèle est mal formé. Bien que le compilateur ne soit pas obligé de diagnostiquer cette erreur, il est autorisé à rejeter le modèle.

Résolution

Une approche pour résoudre ce problème consiste à utiliser un trait de type. pour protéger l'assertion statique :

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

Avec cette modification, le compilateur ne peut pas rejeter le modèle immédiatement car il doit instancier la spécialisation appropriée de foobar pour déterminer la valeur de l'assertion statique, qui échouera toujours 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