Das von Ihnen vorgestellte Szenario beinhaltet die Initialisierung eines statischen constexpr-Mitglieds innerhalb einer Klasse mit a constexpr-Funktion. Leider stießen Versuche, dies mit spezifischen Ansätzen zu erreichen, in verschiedenen Versionen von gcc auf Herausforderungen. In diesem Artikel analysieren wir diese Versuche, untersuchen die zugrunde liegenden Gründe für die Fehler und bieten mögliche Lösungen oder Klarstellungen.
Ihr erster Versuch umfasste die Deklaration der constexpr-Funktion foo und die statische Mitgliedsleiste constexpr innerhalb des Klassenkörpers, was jedoch zu Kompilierungsfehlern führte. Sie weisen darauf hin, dass Funktionsaufrufe nicht innerhalb konstanter Ausdrücke existieren können und dass statische Klassenmitglieder keine Initialisierer haben können, die nicht konstant sind.
Der zweite Versuch hat die Deklarationen außerhalb des Klassenkörpers verschoben , aber dies führte immer noch zu Fehlern. Insbesondere wurde in den Fehlermeldungen erwähnt, dass die statische Datenelementleiste einen Initialisierer haben muss und dass ihre Deklaration als constexpr ihrer vorherigen Deklaration außerhalb der Klasse widerspricht.
Abschnitt 9.4 des C-Standards .2 besagt, dass statische Datenmember vom Literaltyp den constexpr-Bezeichner in ihrer Deklaration haben können. Ihr Initialisierer muss jedoch ein Klammer-oder-Gleich-Initialisierer sein, und jeder darin enthaltene Zuweisungsausdruck muss ein konstanter Ausdruck sein.
Bei Ihren beiden Versuchen fehlte der Deklaration von bar eine Klammer-oder-Gleich -Initialisierer. Daher erfüllt keines von beiden die im Standard festgelegten Anforderungen.
Diese Situation weist jedoch eine inhärente Einschränkung auf, die durch den Standard auferlegt wird. Es verbietet die Initialisierung statischer constexpr-Datenelemente in Kontexten, in denen die Klasse vollständig ist. Daher ist die Verwendung der Klammer-oder-Gleich-Initialisierungsregel nur auf nicht statische Datenelemente anwendbar.
Folglich wird die Initialisierung eines statischen constexpr-Datenelements mithilfe einer constexpr-Funktion, die auf der Vervollständigung der Klasse beruht, unmöglich . Diese Einschränkung ist wahrscheinlich auf die Anforderung zurückzuführen, dass constexpr-Variablen als konstante Ausdrücke zur Kompilierungszeit im Kontext von Mitgliedsfunktionen verfügbar sein müssen. Daher müssen die Variableninitialisierer vor den Funktionskörpern vollständig definiert werden, aber der Initialisierer des statischen Datenelements führt in diesem Kontext zu einem undefinierten Funktionsaufruf, was einen Verstoß gegen die Anforderung an konstante Ausdrücke darstellt.
Das obige ist der detaillierte Inhalt vonWie kann ich ein statisches Constexpr-Mitglied mithilfe einer statischen Constexpr-Funktion in C korrekt initialisieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!