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
Susan Sarandonoriginal
2024-11-13 07:14:02551parcourir

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

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

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;

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

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