Ich sehe keinen technischen Grund warum
struct type {
static const double value = 3.14;
};
ist verboten. Jeder Anlass, bei dem Sie feststellen, wo es funktioniert, ist auf nicht portierbare implementierungsdefinierte Funktionen zurückzuführen. Sie scheinen auch nur von begrenztem Nutzen zu sein. Für in Klassendefinitionen initialisierte Integralkonstanten können Sie sie verwenden und als Nicht-Typ-Argumente an Vorlagen übergeben und als Größe der Array-Dimensionen verwenden. Für Gleitkommakonstanten ist dies jedoch nicht möglich. Das Zulassen von Gleitkomma-Vorlagenparametern würde eigene Regeln mit sich bringen, die die Mühe nicht wirklich wert sind.
Die nächste C ++ - Version erlaubt dies jedoch mit constexpr:
struct type {
static constexpr double value = 3.14;
static constexpr double value_as_function() { return 3.14; }
};
Und wird type::valueeinen konstanten Ausdruck machen. In der Zwischenzeit ist es am besten, dem Muster zu folgen, das auch verwendet wird von std::numeric_limits:
struct type {
static double value() { return 3.14; }
};
Es wird kein konstanter Ausdruck zurückgegeben (Wert ist zur Kompilierungszeit nicht bekannt), aber das ist nur theoretisch wichtig, da der Wert in der Praxis sowieso eingefügt wird. Siehe den constexpr- Vorschlag. Es beinhaltet
4.4
Floating-point constant expressions
Traditionell ist die Bewertung des konstanten Ausdrucks des Fließkommas zur Kompilierungszeit ein heikles Thema. Aus Gründen der Einheitlichkeit und Allgemeinheit empfehlen wir, Konstantausdrucksdaten von Fließkommatypen zuzulassen, die mit konstanten Fließkommaausdrücken initialisiert werden. Dies erhöht auch die Kompatibilität mit C99 [ISO99, §6.6], was dies ermöglicht
[# 5] Ein Ausdruck, der als Konstante ausgewertet wird, ist in mehreren Kontexten erforderlich. Wenn ein schwebender Ausdruck in der Übersetzungsumgebung ausgewertet wird, müssen die arithmetische Genauigkeit und der Bereich mindestens so groß sein, als ob der Ausdruck in der Ausführungsumgebung ausgewertet würde.