Ausdrücke sind keine Konstantenausdrücke, wenn sie einen oder mehrere unzulässige Unterausdrücke enthalten. Eine solche Klasse von unzulässiger Unterausdrücke ist:
- eine L-Wert-zu-R-Wert-Umwandlung (4.1), es sei denn, es zu
- einer glvalue von integralem oder Aufzählungstyp angewandt wird, die auf einen nicht verweist -volatile const Objekt mit einem vorhergehenden Initialisierung mit einem konstanten Ausdruck initialisiert oder
- a glvalue von literalen Typ, der mit
constexpr
definiert auf ein nicht flüchtiges Objekt bezieht, oder das bezieht sich auf ein Subobjekt eines solchen Objekts oder
- ein glvalue des literalen Typs, der sich auf ein nichtflüchtiges temporäres Objekt bezieht, dessen Lebensdauer nicht beendet ist, initialisiert mit einem konstanten Ausdruck;
Insbesondere während des Name eines const Objekts von ENUM oder intergral Typ initialisiert mit einem konstanten Initialisierer bildet einen konstanten Ausdruck (dessen Wert zu lesen ist, was die L-Wert-zu-R-Wert bewirkt, Konvertierung), Unterobjekte eines const Aggregatobjekts (wie list
in Ihrem Beispiel, ein Array) nicht, würde aber, wenn constexpr
deklariert werden.
const int list[3] = { 2, 5, 7 };
const int a = list[2];
Dies gilt aber a
keinen konstanten Ausdruck darstellen, weil es nicht mit einem konstanten Ausdruck initialisiert wird.
Durch Ändern der Deklaration von list
(wir müssen die Deklaration von a
nicht ändern), können wir a
einen konstanten Ausdruck bilden.
constexpr int list[3] = { 2, 5, 7 };
const int a = list[2];
Als list[2]
ist nun ein konstanter Ausdruck , a
ist nun ein const
Objekt der intergral Typ mit einem konstanten Ausdruck initialisiert so kann a
nun als konstanter Ausdruck verwendet werden.
Ich hätte gedacht, dass constexpr hilfreich wäre, und jetzt, wo ich sehe, sehe ich, dass es eine breitere Akzeptanz hat, als ich dachte. Mit diesem gesagt, ein bisschen mehr eine Erklärung, warum die Deklaration von const int a funktioniert aber Liste [1] speziell nicht geschätzt wird. Vielen Dank. –
OK, also Visual Studio 2012 plant nicht, constexpr zu unterstützen. Hat jemand andere Lösungen? Ich muss es nicht dafür verwenden, aber es wäre nett. –
@ Std''OrgnlDave Ich habe mehr von der Compiler-Diagnose hinzugefügt, die genau erklärt, warum list [1] kein konstanter Ausdruck ist. – bames53