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
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!