constexpr Spezifizierer (seit C23)
Ein Skalarobjekt, das mit dem Speicherklassen-Spezifizierer constexpr deklariert wird, ist eine Konstante. Es muss vollständig und explizit gemäß den Regeln für statische Initialisierung initialisiert werden. Es hat immer noch die für seine Deklaration passende Linkage und existiert zur Laufzeit, damit seine Adresse genommen werden kann; es kann einfach nicht auf irgendeine Weise zur Laufzeit modifiziert werden, d.h. der Compiler kann sein Wissen über den festen Wert des Objekts in jeder anderen konstanten Ausdruck verwenden.
Zusätzlich wird der konstante Ausdruck, der für den Initialisierer einer solchen Konstante verwendet wird, zur Kompilierzeit überprüft.
Ein Initialisierer vom Fließkommatyp muss mit der Übersetzungszeit-Fließkomm-Umgebung ausgewertet werden.
Es gibt einige Einschränkungen hinsichtlich des Typs eines Objekts, das mit constexpr deklariert werden kann. Insbesondere sind die folgenden Konstrukte nicht erlaubt, constexpr zu sein:
- Zeiger (außer dass Nullzeiger
constexprsein können), - Variabel modifizierte Typen,
- Atomare Typen,
-
volatileTypen, -
restrictZeiger.
Inhalt |
[bearbeiten] Schlüsselwörter
[bearbeiten] Anmerkungen
[bearbeiten] 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; // is not affected by fesetround() above printf("%f\n", h); }
Ausgabe
0.696969
[bearbeiten] Referenzen
- C23-Standard (ISO/IEC 9899:2024)
- TBD TBD (p: TBD)
[bearbeiten] Siehe auch
| C++ Dokumentation für
constexpr Typ-Spezifizierer |