Der constexpr Spezifizierer erklärt, dass es möglich ist, den Wert der Funktion oder Variable bei der Kompilierung zu bewerten. Solche Variablen und Funktionen können dann verwendet werden, wenn nur Kompilierzeitkonstante Ausdrücke zulässig sind.
Die Standardvorbelegung 11 Listen ++ C, wo ein konstanter Ausdruck erforderlich ist, in Absatz 5.19
und es sieht komplett:
An mehreren Stellen erfordert C++ Ausdrücke, die zu einer Integral oder Aufzählung bewerten constant: as array bounds (8.3.4, 5.3.4), als Case-Ausdrücke (6.4.2), als Bitfeldlängen (9.6), als Enumeratorinitialisierer (7.2), als statische Memberinitialisierer (9.4.2) , und als Integral- oder Enumerations-Nicht-Typ-Template-Argumente (14.3).
der Rest des Absatzes sagt:
Ein integraler konstanter Ausdruck nur Literale von arithmetischen Typen handeln kann (2.13, 3.9.1), Enumeratoren, nichtflüchtige Konstanten Variablen oder statische Datenelemente von Integral- oder Enumerationstypen initialisiert mit konstanten Ausdrücken (8.5), Nicht-Typ-Vorlage Parameter von Integral- oder Enumerationstypen und sizeof-Ausdrücke. Fließliterale (2.13.3) können nur angezeigt werden, wenn sie in Integral- oder Aufzählungstypen umgewandelt werden. Es können nur Umrechnungen in Ganzzahl- oder Aufzählungstypen verwendet werden. Insbesondere dürfen, außer in sizeof Ausdrücke, Funktionen, Klassenobjekte, Zeiger oder Referenzen nicht verwendet werden, und die Zuweisung, Inkrementierung, Dekrementierung, Funktionsaufruf oder Kommaoperatoren dürfen nicht verwendet werden.
und wird gefolgt von 5
weitere Absätze, die weitere Anforderungen auflisten.
In C++ 11 gibt es eine Liste, in der konstante Ausdrücke im Absatz verwendet werden können, aber es wird nicht klargestellt, wo sie benötigt werden. Sie haben wahrscheinlich für den Begriff konstanten Ausdruck suchen alle Orte zu finden, wo es erforderlich ist, und in der Regel wird es eine Phrase ähnlich sein:
ist ein konstanter Ausdruck
Die sein soll der wichtige Begriff sein, da die Verletzung Anforderung das Programm schlecht gebildet macht.
Alternativ können Sie Annex A
Grammatik Zusammenfassung und die Suche verwenden für konstanten Ausdruck und das sollte alle Orte in der Grammatik abdecken, in denen ein konstanten Ausdruck erforderlich ist, zum Beispiel:
enumerator = constant-expression
Fußnote:
- Diese enthält eine vollständige Liste der Normentwürfe. Leider ist der nächste, der der Öffentlichkeit zugänglich ist, von frühem
2005
. Die früheren Versionen erfordern eine Authentifizierung. So weit ich weiß Abschnitt 5.19
hat sich nicht viel geändert.
Warten Sie eine Minute !: "Array Deklarationen erfordern eine * Konstante * Ausdruck"? Warum sagst du das? – wallyk
@wallyk Weil es wahr ist. –
@KonradRudolph das Geschenk der Compiler-Erweiterungen, es ist erstaunlich, wie viele C++ - Entwickler das nicht wissen. –