Maison >développement back-end >C++ >Pourquoi « reinterpret_cast » provoque-t-il une erreur de compilation lors de l'initialisation d'une variable « constexpr » ?

Pourquoi « reinterpret_cast » provoque-t-il une erreur de compilation lors de l'initialisation d'une variable « constexpr » ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-13 04:37:02776parcourir

Why Does `reinterpret_cast` Cause a Compilation Error When Initializing a `constexpr` Variable?

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>
<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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn