constexpr et initialisation d'un pointeur statique const void avec reinterpret_cast : différences entre les compilateurs expliquées
Dans l'extrait de code donné, un constexpr const void statique le pointeur est déclaré à l’aide d’un reinterpret_cast. Ce code soulève la question de savoir quelle interprétation du compilateur est correcte selon la norme et quelle est la manière appropriée de déclarer de telles expressions.
Légitimité du compilateur
La norme dicte qu'un constexpr La variable, telle que le pointeur static const void dans ce cas, doit être initialisée avec une expression constante. Cependant, une expression reinterpret_cast n'est pas considérée comme une expression constante de base selon la norme C 11. Par conséquent, clang est correct en signalant une erreur pour ce code.
Déclarations appropriées
Pour déclarer correctement un pointeur static constexpr const void Voici quelques options :
Utiliser intptr_t à la place : Utilisez un type intptr_t et convertissez-le en un pointeur vide lors de la récupération de la valeur, comme suit :
static constexpr intptr_t ptr = 0x1; // ... reinterpret_cast<void*>(ptr);
Extension GCC/clang : GCC et clang prennent en charge une extension peu documentée utilisant __builtin_constant_p :
static constexpr const void* ptr = __builtin_constant_p( reinterpret_cast<const void*>(0x1) ) ? reinterpret_cast<const void*>(0x1) : reinterpret_cast<const void*>(0x1) ;
Cette expression sera pliée en constante par les deux compilateurs. Notez cependant que cette extension ne fait pas partie du standard et pourrait ne pas être prise en charge dans les futures versions du compilateur.
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!