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
Barbara Streisandoriginal
2024-11-06 00:09:02361parcourir

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");
}

Résultats en :

static_assertion failed "this function has to be implemented for the desired type"

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");
}

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!

Déclaration:
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