Maison > développement back-end > C++ > le corps du texte

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

Mary-Kate Olsen
Libérer: 2024-11-13 04:37:02
original
763 Les gens l'ont consulté

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
Copier après la connexion

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);
Copier après la connexion

};
< ;/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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Recommandations populaires
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal