Maison >développement back-end >C++ >Comment un membre statique `constexpr` peut-il être initialisé à l'aide d'une fonction statique `constexpr` en 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!