constexpr specifier (since C23)
Ein Skalarobjekt, das mit dem constexpr Speicherklassenspezifizierer deklariert wird, ist eine Konstante . Es muss vollständig und explizit gemäß den Regeln für die statische Initialisierung initialisiert werden. Es behält weiterhin die für seine Deklaration passende Bindung und existiert zur Laufzeit, um seine Adresse verwenden zu können; es kann lediglich zur Laufzeit in keiner Weise modifiziert werden, d.h. der Compiler kann sein Wissen über den festen Wert des Objekts in jeder anderen konstanten Expression nutzen.
Zusätzlich wird der konstante Ausdruck, der für den Initialisierer einer solchen Konstante verwendet wird, zur Kompilierzeit überprüft.
Ein Initialisierer vom Gleitkommatyp muss mit der Übersetzungszeit-Gleitkommaumgebung ausgewertet werden.
Es gibt einige Einschränkungen bezüglich des Typs eines Objekts, das mit constexpr deklariert werden kann. Insbesondere sind die folgenden Konstrukte nicht als constexpr zulässig:
- Zeiger (außer dass Nullzeiger constexpr sein können),
- Variabel modifizierte Typen,
- Atomare Typen ,
-
volatile-Typen, -
restrict-Zeiger.
Inhaltsverzeichnis |
Schlüsselwörter
Beispiel
#include <fenv.h> #include <stdio.h> int main(void) { constexpr float f = 23.0f; constexpr float g = 33.0f; fesetround(FE_TOWARDZERO); constexpr float h = f / g; // wird nicht durch fesetround() oben beeinflusst printf("%f\n", h); }
Ausgabe:
0.696969
Referenzen
- C23-Standard (ISO/IEC 9899:2024):
-
- 6.7.2 Speicherklassenspezifizierer (S: 98-103)
Siehe auch
|
C++ Dokumentation
für
constexpr
Typ-Spezifizierer
|