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
551 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!

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