Constexpr Initialisation de la variable avec reinterpret_cast et compatibilité du compilateur
Considérez l'extrait de code suivant :
struct foo { static constexpr const void* ptr = reinterpret_cast<const void*>(0x1); };
Lors de la compilation avec g v4.9, ce code se compile avec succès. Cependant, clang v3.4 ne parvient pas à se compiler, émettant l'erreur :
error: constexpr variable 'ptr' must be initialized by a constant expression
Correctivité du compilateur
Selon le projet de norme C 11 (section 5.19, paragraphe 2 ), une expression conditionnelle n’est pas considérée comme une expression constante si elle implique un reinterpret_cast. Par conséquent, clang a raison dans son interprétation selon laquelle l'initialisation de ptr n'est pas valide.
Déclaration appropriée
Pour déclarer correctement une expression constante de cette nature, il faut utiliser intptr_t à la place et cast si nécessaire :
static constexpr intptr_t ptr = 0x1;
Alternativement, une solution de contournement prise en charge à la fois par gcc et clang implique l'utilisation de la macro __builtin_constant_p non documentée :
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 est acceptée par les deux compilateurs en raison à la vérification __builtin_constant_p, qui force l'expression à être pliée en constante.
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!