constexpr et initialisation d'un pointeur Void const statique avec réinterprétation du casting : écart de compilateur
L'extrait de code suivant illustre le problème :
struct foo { static constexpr const void* ptr = reinterpret_cast<const void*>(0x1); };
Compilateur Différence
Bien que ce code se compile avec succès dans g v4.9, il ne parvient pas à se compiler dans clang v3.4. Clang génère l'erreur :
error: constexpr variable 'ptr' must be initialized by a constant expression
Conformité standard
Selon la norme C 11, une variable constexpr doit être initialisée par une expression constante. Reinterpret_cast n'est pas une expression constante, comme indiqué dans la section 5.19, paragraphe 2 du projet de norme C 11. Par conséquent, clang a raison de rejeter le code.
Déclaration appropriée
La bonne façon de déclarer une variable constexpr avec une conversion de réinterprétation est d'utiliser la macro __builtin_constant_p. Cette macro permet le repliement constant d'expressions non constantes. Le code modifié suivant se compile à la fois en g et en clang :
static constexpr const void* ptr = __builtin_constant_p( reinterpret_cast<const void*>(0x1) ) ? reinterpret_cast<const void*>(0x1) : reinterpret_cast<const void*>(0x1) ;
Ce code utilise l'opérateur conditionnel ternaire pour tester si l'expression de conversion réinterprétée est une expression constante. Si c'est vrai, le casting est effectué, sinon l'évaluation échoue.
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!