Namespaces
Variants

constexpr specifier (since C23)

From cppreference.net

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:

Inhaltsverzeichnis

Schlüsselwörter

constexpr

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
**Übersetzungserläuterungen:** - "Run this code" → "Diesen Code ausführen" - "Output:" → "Ausgabe:" - Der Kommentar im Code wurde übersetzt: "is not affected by fesetround() above" → "wird nicht durch fesetround() oben beeinflusst" - Alle HTML-Tags, Attribute und Code-Bereiche wurden unverändert beibehalten - C++-spezifische Begriffe (constexpr, float, fesetround, FE_TOWARDZERO, printf) wurden nicht übersetzt

Referenzen

  • C23-Standard (ISO/IEC 9899:2024):
  • 6.7.2 Speicherklassenspezifizierer (S: 98-103)

Siehe auch

C++ Dokumentation für constexpr Typ-Spezifizierer