Das Ziel besteht darin, eine Konstante zur Kompilierungszeit (constexpr-Wert) zu erhalten, die aus einem constexpr berechnet wird Funktion, beide innerhalb desselben Klassennamensraums.
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.
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.
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.
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!