Maison > développement back-end > C++ > Comment un membre statique `constexpr` peut-il être initialisé à l'aide d'une fonction statique `constexpr` en C ?

Comment un membre statique `constexpr` peut-il être initialisé à l'aide d'une fonction statique `constexpr` en C ?

Barbara Streisand
Libérer: 2024-12-09 22:35:11
original
938 Les gens l'ont consulté

How Can a `constexpr` Static Member Be Initialized Using a `constexpr` Static Function in C  ?

Utilisation d'une fonction statique constexpr pour initialiser un membre statique constexpr

Le but de ce code est de créer une valeur constexpr dans l'espace de noms de une classe en utilisant une fonction statique constexpr et un membre statique. Cependant, les tentatives pour y parvenir ont rencontré des erreurs de compilation avec différentes versions de g .

Première tentative

class C1 {
  constexpr static int foo(int x) { return x + 1; }
  constexpr static int bar = foo(sizeof(int));
};
Copier après la connexion

Ce code échoue avec g 4.5.3 et 4.6. 3 en raison de la présence d'un appel de fonction dans l'initialisation du membre statique constexpr.

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

Ce code échoue avec g 4.6.3 car le membre de données statique constexpr doit avoir un initialiseur dans sa déclaration.

Exigences de la norme

Selon la section 9.4.2 de la norme C, une donnée membre statique de type littéral peut être déclarée dans la définition de classe avec le spécificateur constexpr. Si tel est le cas, la déclaration doit spécifier une accolade ou un initialiseur égal, où chaque clause d'initialisation est une expression constante.

Dans le code "deuxième tentative", la déclaration n'a pas d'accolade-ou- égal-initialiseur. Par conséquent, il ne répond pas aux exigences de la norme.

Impossibilité de l'objectif

Malheureusement, la norme exclut l'initialisation d'un membre de données constexpr statique dans n'importe quel contexte où la classe est complet. En effet, les variables constexpr doivent être disponibles en tant qu'expressions constantes au moment de la compilation depuis le corps des fonctions membres. Par conséquent, les initialiseurs de variables sont complètement définis avant les corps de fonction, ce qui signifie que la fonction est encore incomplète dans le contexte de l'initialiseur. Par conséquent, l'expression n'est pas considérée comme une expression constante.

Conclusion

En raison des limitations du standard C, il n'est pas possible d'initialiser une donnée constexpr statique membre utilisant une fonction statique constexpr lorsque la classe est terminée.

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