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
Barbara Streisandoriginal
2024-12-09 22:35:11884parcourir

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

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

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!

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