Maison  >  Article  >  développement back-end  >  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
Linda Hamiltonoriginal
2024-11-13 03:32:02732parcourir

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

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

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

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

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