Maison > développement back-end > C++ > Est-il légal d'initialiser un pointeur statique constexpr const void en utilisant reinterpret_cast ?

Est-il légal d'initialiser un pointeur statique constexpr const void en utilisant reinterpret_cast ?

Linda Hamilton
Libérer: 2024-11-12 03:35:01
original
975 Les gens l'ont consulté

Is it legal to initialize a static constexpr const void pointer using reinterpret_cast?

constexpr et initialisation d'un pointeur statique const void avec reinterpret_cast : différences entre les compilateurs expliquées

Dans l'extrait de code donné, un constexpr const void statique le pointeur est déclaré à l’aide d’un reinterpret_cast. Ce code soulève la question de savoir quelle interprétation du compilateur est correcte selon la norme et quelle est la manière appropriée de déclarer de telles expressions.

Légitimité du compilateur

La norme dicte qu'un constexpr La variable, telle que le pointeur static const void dans ce cas, doit être initialisée avec une expression constante. Cependant, une expression reinterpret_cast n'est pas considérée comme une expression constante de base selon la norme C 11. Par conséquent, clang est correct en signalant une erreur pour ce code.

Déclarations appropriées

Pour déclarer correctement un pointeur static constexpr const void Voici quelques options :

  1. Utiliser intptr_t à la place : Utilisez un type intptr_t et convertissez-le en un pointeur vide lors de la récupération de la valeur, comme suit :

    static constexpr intptr_t ptr = 0x1;
    // ...
    reinterpret_cast<void*>(ptr);
    Copier après la connexion
  2. Extension GCC/clang : GCC et clang prennent en charge une extension peu documentée utilisant __builtin_constant_p :

    static constexpr const void* ptr = 
      __builtin_constant_p( reinterpret_cast<const void*>(0x1) ) ? 
        reinterpret_cast<const void*>(0x1) : reinterpret_cast<const void*>(0x1) ;
    Copier après la connexion

Cette expression sera pliée en constante par les deux compilateurs. Notez cependant que cette extension ne fait pas partie du standard et pourrait ne pas être prise en charge dans les futures versions du compilateur.

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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal