Maison > Article > développement back-end > Le reinterpret_cast d'un littéral est-il valide pour l'initialisation d'un pointeur constexpr Static Const Void ?
Considérez l'extrait de code suivant :
struct foo { static constexpr const void* ptr = reinterpret_cast<const void*>(0x1); }; auto main() -> int { return 0; }
Ce code se compile avec succès dans g v4.9 mais échoue dans clang v3.4, générant l'erreur :
error: constexpr variable 'ptr' must be initialized by a constant expression
Selon la norme C 11 section 5.19 (Constante Expressions), les expressions conditionnelles ne sont pas considérées comme des expressions constantes de base lorsqu'elles impliquent reinterpret_cast. Par conséquent, clang a raison de signaler ce code comme une erreur.
Une solution simple consiste à utiliser intptr_t à la place et à convertir en void* en cas de besoin :
static constexpr intptr_t ptr = 0x1; reinterpret_cast<void*>(foo::ptr);
Cependant, gcc et clang prennent en charge une solution de contournement non documentée utilisant __builtin_constant_p pour permettre le repliement constant d'expressions non constantes :
static constexpr const void* ptr = __builtin_constant_p(reinterpret_cast<const void*>(0x1)) ? reinterpret_cast<const void*>(0x1) : reinterpret_cast<const void*>(0x1);
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!