Maison > développement back-end > C++ > « reinterpret_cast » peut-il être utilisé pour initialiser un pointeur const void statique « constexpr » ?

« reinterpret_cast » peut-il être utilisé pour initialiser un pointeur const void statique « constexpr » ?

Patricia Arquette
Libérer: 2024-11-30 03:19:10
original
970 Les gens l'ont consulté

Can `reinterpret_cast` be used to initialize a `constexpr` static const void pointer?

constexpr et initialisation d'un pointeur Void const statique avec réinterprétation du casting : écart de compilateur

L'extrait de code suivant illustre le problème :

struct foo {
  static constexpr const void* ptr = reinterpret_cast<const void*>(0x1);
};
Copier après la connexion

Compilateur Différence

Bien que ce code se compile avec succès dans g v4.9, il ne parvient pas à se compiler dans clang v3.4. Clang génère l'erreur :

error: constexpr variable 'ptr' must be initialized by a constant expression
Copier après la connexion

Conformité standard

Selon la norme C 11, une variable constexpr doit être initialisée par une expression constante. Reinterpret_cast n'est pas une expression constante, comme indiqué dans la section 5.19, paragraphe 2 du projet de norme C 11. Par conséquent, clang a raison de rejeter le code.

Déclaration appropriée

La bonne façon de déclarer une variable constexpr avec une conversion de réinterprétation est d'utiliser la macro __builtin_constant_p. Cette macro permet le repliement constant d'expressions non constantes. Le code modifié suivant se compile à la fois en g et en clang :

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

Ce code utilise l'opérateur conditionnel ternaire pour tester si l'expression de conversion réinterprétée est une expression constante. Si c'est vrai, le casting est effectué, sinon l'évaluation échoue.

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