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
Patricia Arquetteoriginal
2024-11-30 03:19:10974parcourir

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);
};

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

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)  ;

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!

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