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

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

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-30 07:02:17978Durchsuche

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

constexpr initialisiert statisches Mitglied mithilfe einer statischen Funktion

Problem

Das Ziel besteht darin, eine Konstante zur Kompilierungszeit (constexpr-Wert) zu erhalten, die aus einem constexpr berechnet wird Funktion, beide innerhalb desselben Klassennamensraums.

Zuerst Versuch

class C1 {
  constexpr static int foo(int x) { return x + 1; }
  constexpr static int bar = foo(sizeof(int));
};

Dies schlägt jedoch sowohl bei g -4.5.3 als auch bei g -4.6.3 fehl, da im Initialisierer nicht konstante Ausdrücke verwendet wurden.

Zweiter Versuch

class C2 {
  constexpr static int foo(int x) { return x + 1; }
  constexpr static int bar;
};
constexpr int C2::bar = C2::foo(sizeof(int));

Während dies auf g -4.5.3 kompiliert wird, zeigt g -4.6.3 Inkonsistenz und Neudeklarationsfehler.

Erklärung

Gemäß dem C-Standard (Abschnitt 9.4.2) kann ein statisches Datenelement „constexpr“ nur mit einer geschweiften Klammer oder einem Gleichheitsinitialisierer im deklariert werden Klassendefinition, wobei jede Initialisierungsklausel ein konstanter Ausdruck sein muss.

Im „zweiten Versuch“ die Deklaration Es fehlt der erforderliche Klammer-oder-Gleich-Initialisierer.

Fazit

Entgegen anfänglichen Annahmen erweisen sich beide Versuche als erfolglos. Der Standard verbietet die Initialisierung statischer constexpr-Datenelemente in Kontexten, in denen die Klasse vollständig ist.

Das obige ist der detaillierte Inhalt vonWie kann ich ein statisches constexpr-Mitglied mithilfe einer statischen constexpr-Funktion in C initialisieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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