Maison >développement back-end >C++ >Comment puis-je initialiser un membre constexpr statique à l'aide d'une fonction constexpr statique en C ?

Comment puis-je initialiser un membre constexpr statique à l'aide d'une fonction constexpr statique en C ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-30 07:02:17977parcourir

How Can I Initialize a Static constexpr Member Using a Static constexpr Function in C  ?

constexpr Initialisation d'un membre statique à l'aide d'une fonction statique

Problème

L'objectif est d'obtenir une constante de compilation (valeur constexpr) calculée à partir d'un constexpr fonction, toutes deux dans le même espace de noms de classe.

Premier Tentative

class C1 {
  constexpr static int foo(int x) { return x + 1; }
  constexpr static int bar = foo(sizeof(int));
};

Cependant, cela échoue à la fois sur g -4.5.3 et g -4.6.3, citant l'utilisation d'expressions non constantes dans l'initialiseur.

Deuxième tentative

class C2 {
  constexpr static int foo(int x) { return x + 1; }
  constexpr static int bar;
};
constexpr int C2::bar = C2::foo(sizeof(int));

Alors que cela compile sur g -4.5.3, g -4.6.3 montre une incohérence et erreurs de redéclaration.

Explication

Selon la norme C (section 9.4.2), un membre de données statique constexpr ne peut être déclaré qu'avec une accolade ou un initialiseur égal dans la classe définition, où chaque clause d'initialisation doit être une expression constante.

Dans la "deuxième tentative", la déclaration n'a pas la déclaration requise accolade-or-equal-initializer.

Conclusion

Contrairement aux hypothèses initiales, les deux tentatives s'avèrent infructueuses. La norme interdit l'initialisation des membres de données constexpr statiques dans des contextes où la classe est complète.

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