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
Libérer: 2024-11-30 07:02:17
original
1052 Les gens l'ont consulté

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));
};
Copier après la connexion

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));
Copier après la connexion

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!

source:php.cn
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