2014-09-24 9 views
13

Das Schlüsselwort constexpr wurde in C++ 11 eingeführt, da (denke ich) die entsprechende Idee von "konstanten Ausdrücken" war. Jedoch wurde dieses Konzept implizit in C++ 98/C++ 03, da Array Erklärungen einen konstanten Ausdruck erfordern:"Konstante Ausdrücke" vor C++ 11

// valid: 
int a[sizeof(int)]; 
int b[3+7]; 
int c[13/4]; 
const int n = 3; 
int d[n]; 
// invalid: 
int m = 4; 
int e[m]; 

Es gibt noch anderen „konstanten Ausdrücke“, dh Ausdrücke, die sein kann (und/oder muss) zur Kompilierzeit ausgewertet werden; Ein Beispiel sind Template-Argumente.

Gibt es für pre-C++ 11 das Folgende, entweder in den C++ 98/03-Standards oder anderswo?

  • Eine vollständige Liste der syntaktischen Konstrukte konstante Ausdrücke erfordern (zB Array-Deklarationen und Vorlage instantiations)
  • Die Regeln für derartige konstante Ausdrücke regeln (vermutlich wäre dies nur eine Abbildung von den Elementen in der obigen Liste, um ihre Definitionen sein im Standard)
+0

Warten Sie eine Minute !: "Array Deklarationen erfordern eine * Konstante * Ausdruck"? Warum sagst du das? – wallyk

+4

@wallyk Weil es wahr ist. –

+1

@KonradRudolph das Geschenk der Compiler-Erweiterungen, es ist erstaunlich, wie viele C++ - Entwickler das nicht wissen. –

Antwort

12

constexpr und konstanter Ausdrücke in diesem constexpr verwandt sind sagt uns, dass eine Variable oder Funktion verwendet werden kann, wo ein konstanter Ausdruck kann verwendet werden. Dies ist, was cppreference uns sagen:

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.

Constant expresions vorhanden waren, bevor C++ 11 und die Regeln für konstanten Ausdrücke pre C 11 ++ sind an der gleichen Stelle in den C++03 draft standard bedeckt (dies den frühesten öffentlichen Entwurf verfügbar am nächsten C + ist +03) als draft C++11 standard die Abschnitt 5.19Konstante Ausdrücke ist, hat cppreference eine gute Zusammenfassung zu diesem Thema in Constant expressions Seite, aber es richtet sich an C++ 11 und C++ 14 und es ist schwer zu sagen, was gilt vor C++ 11.

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

  1. 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.
+0

Der Standardentwurf, den Sie verlinken, stammt aus 2005 ... ist das wirklich für 'C++ 03'? –

+0

@KyleStrand es ist frühesten öffentlichen Entwurf Standard verfügbar, finden Sie eine vollständige Liste des Entwurfs verfügbar für alle [hier] (http://stackoverflow.com/questions/81656/where-do-i-find-the-current -c-oder-c-Standard-Dokumente). –