Maison > développement back-end > C++ > « reinterpret_cast » peut-il être utilisé pour initialiser une variable « constexpr » ?

« reinterpret_cast » peut-il être utilisé pour initialiser une variable « constexpr » ?

Susan Sarandon
Libérer: 2024-11-13 07:14:02
original
532 Les gens l'ont consulté

Can `reinterpret_cast` be used to initialize a `constexpr` variable?

Constexpr Initialisation de la variable avec reinterpret_cast et compatibilité du compilateur

Considérez l'extrait de code suivant :

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

Lors de la compilation avec g v4.9, ce code se compile avec succès. Cependant, clang v3.4 ne parvient pas à se compiler, émettant l'erreur :

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

Correctivité du compilateur

Selon le projet de norme C 11 (section 5.19, paragraphe 2 ), une expression conditionnelle n’est pas considérée comme une expression constante si elle implique un reinterpret_cast. Par conséquent, clang a raison dans son interprétation selon laquelle l'initialisation de ptr n'est pas valide.

Déclaration appropriée

Pour déclarer correctement une expression constante de cette nature, il faut utiliser intptr_t à la place et cast si nécessaire :

static constexpr intptr_t ptr = 0x1;
Copier après la connexion

Alternativement, une solution de contournement prise en charge à la fois par gcc et clang implique l'utilisation de la macro __builtin_constant_p non documentée :

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 est acceptée par les deux compilateurs en raison à la vérification __builtin_constant_p, qui force l'expression à être pliée en constante.

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