constexpr et reinterpret_cast : Erreur dans la compilation C
Considérez l'extrait de code suivant :
<br>struct foo {<br> static constexpr const void<em> ptr = reinterpret_cast<const void</em>>(0x1);<br>};<br>
Ce code se compile sans erreur dans g v4.9, mais échoue dans clang v3.4 avec le erreur :
error: constexpr variable 'ptr' must be initialized by a constant expression
Quel compilateur est correct ?
Selon la norme C 11, clang est correct. La norme stipule qu'une expression constante ne doit pas impliquer de reinterpret_cast. Cela signifie que l'initialisation de ptr dans l'extrait de code n'est pas valide.
Initialisation appropriée
La bonne façon de déclarer une expression de ce type serait d'utiliser une alternative méthode, telle que :
<br>struct foo {<br> static constexpr intptr_t ptr = 0x1;<br>};<br>
Cela fonctionnerait à la fois en clang et en g.
Solution de contournement pour GCC
Bien que l'acceptation par GCC de l'extrait de code original soit techniquement incorrecte, elle prend en charge une solution de contournement à l'aide de la macro __builtin_constant_p :
<br>struct foo {<br> static constexpr const void* ptr =</p> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">__builtin_constant_p( reinterpret_cast<const void*>(0x1) ) ? reinterpret_cast<const void*>(0x1) : reinterpret_cast<const void*>(0x1);
};
< ;/pre>
Cette solution de contournement permet à GCC de replier le expression non constante et la traite comme une constante. Cependant, il ne fait pas partie de la norme C et doit être utilisé avec prudence.
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!