Maison >développement back-end >C++ >Comment puis-je initialiser correctement un membre statique Constexpr à l'aide d'une fonction statique Constexpr en C ?
Le scénario que vous avez présenté implique l'initialisation d'un membre statique constexpr au sein d'une classe à l'aide d'un fonction constexpr. Malheureusement, les tentatives pour y parvenir avec des approches spécifiques ont rencontré des défis dans différentes versions de gcc. Dans cet article, nous disséquons ces tentatives, explorons les raisons sous-jacentes des erreurs et proposons des solutions ou des clarifications possibles.
Votre tentative initiale impliquait de déclarer à la fois la fonction constexpr foo et la barre de membres statiques constexpr dans le corps de la classe, mais cela a conduit à des erreurs de compilation. Ils indiquent que les appels de fonction ne peuvent pas exister dans des expressions constantes et que les membres de classe statiques ne peuvent pas avoir d'initialiseurs qui ne sont pas constants.
La deuxième tentative a déplacé les déclarations en dehors du corps de la classe , mais cela entraînait toujours des erreurs. Notamment, les messages d'erreur mentionnaient que la barre de données membres statiques devait avoir un initialiseur et que sa déclaration en tant que constexpr contredisait sa déclaration précédente en dehors de la classe.
La section 9.4 de la norme C .2 indique que les données membres statiques de type littéral peuvent avoir le spécificateur constexpr dans leur déclaration. Cependant, leur initialiseur doit être un initialiseur avec accolade ou égal, et toute expression d'affectation qu'il contient doit être une expression constante.
Dans vos deux tentatives, la déclaration de bar manquait d'accolade ou d'égalité. -initialiseur. Par conséquent, aucun d’eux ne répond aux exigences énoncées par la norme.
Cette situation a cependant une limitation inhérente imposée par la norme. Il interdit l’initialisation des données membres statiques constexpr dans les contextes où la classe est complète. Par conséquent, l'utilisation de la règle accolade-or-equal-initializer n'est applicable qu'aux données membres non statiques.
Par conséquent, l'initialisation d'un membre de données constexpr statique à l'aide d'une fonction constexpr qui repose sur l'achèvement de la classe devient impossible. . Cette restriction est probablement due à l'exigence selon laquelle les variables constexpr doivent être disponibles en tant qu'expressions constantes au moment de la compilation dans le contexte des fonctions membres. Par conséquent, les initialiseurs de variables doivent être entièrement définis avant les corps de fonction, mais l'initialiseur du membre de données statique conduit à une invocation de fonction non définie dans ce contexte, violant l'exigence d'expression constante.
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!