Heim > Backend-Entwicklung > C++ > Wie kann ich ein statisches Constexpr-Mitglied mithilfe einer statischen Constexpr-Funktion in C korrekt initialisieren?

Wie kann ich ein statisches Constexpr-Mitglied mithilfe einer statischen Constexpr-Funktion in C korrekt initialisieren?

Linda Hamilton
Freigeben: 2024-12-02 13:35:12
Original
741 Leute haben es durchsucht

How Can I Correctly Initialize a Constexpr Static Member Using a Constexpr Static Function in C  ?

constexpr Statisches Mitglied mit statischer Funktion initialisieren: Eine exemplarische Vorgehensweise

Einführung

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.

Erster Versuch und sein Fehler

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.

Zweiter Versuch und sein Fehler

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.

Analyse des Standards

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.

Einschränkungen und Lösung

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage