Maison > développement back-end > C++ > Le reinterpret_cast d'un littéral est-il valide pour l'initialisation d'un pointeur constexpr Static Const Void ?

Le reinterpret_cast d'un littéral est-il valide pour l'initialisation d'un pointeur constexpr Static Const Void ?

Linda Hamilton
Libérer: 2024-11-13 03:32:02
original
817 Les gens l'ont consulté

Is reinterpret_cast of a Literal Valid for Initializing a constexpr Static Const Void Pointer?

constexpr et initialisation d'un pointeur statique Const Void avec réinterprétation du casting : quel compilateur est correct ?

Description du problème

Considérez l'extrait de code suivant :

struct foo {
  static constexpr const void* ptr = reinterpret_cast<const void*>(0x1);
};

auto main() -> int {
  return 0;
}
Copier après la connexion

Ce code se compile avec succès dans g v4.9 mais échoue dans clang v3.4, générant l'erreur :

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

Questions

  1. Quel compilateur est correct selon la norme ?
  2. Quelle est la bonne manière déclarer un tel expression ?

Réponse

  1. Le compilateur clang est correct

Selon la norme C 11 section 5.19 (Constante Expressions), les expressions conditionnelles ne sont pas considérées comme des expressions constantes de base lorsqu'elles impliquent reinterpret_cast. Par conséquent, clang a raison de signaler ce code comme une erreur.

  1. Déclaration appropriée

Une solution simple consiste à utiliser intptr_t à la place et à convertir en void* en cas de besoin :

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

Cependant, gcc et clang prennent en charge une solution de contournement non documentée utilisant __builtin_constant_p pour permettre le repliement constant d'expressions non constantes :

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