Namensräume
Varianten
Aktionen

Konstante Initialisierung

Von cppreference.com
< cpp‎ | Sprache
 
 
C++ Sprache
Allgemeine Themen
Kontrollfluss
Bedingte Ausführungsaussagen
if
Iterationsanweisungen (Schleifen)
for
Bereichs-for (C++11)
Sprunganweisungen
Funktionen
Funktionsdeklaration
Lambda-Funktionsausdruck
inline-Spezifizierer
Dynamische Ausnahmespezifikationen (bis C++17*)
noexcept-Spezifizierer (C++11)
Ausnahmen
Namensräume
Typen
Spezifizierer
const/volatile
decltype (C++11)
auto (C++11)
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Speicherdauer-Spezifizierer
Initialisierung
Ausdrücke
Alternative Darstellungen
Literale
Boolesch - Ganzzahl - Gleitkommazahl
Zeichen - String - nullptr (C++11)
Benutzerdefinierte (C++11)
Dienstprogramme
Attribute (C++11)
Typen
typedef-Deklaration
Typalias-Deklaration (C++11)
Umwandlungen
Speicherzuweisung
Klassen
Klassenspezifische Funktionseigenschaften
explicit (C++11)
static

Spezielle Member-Funktionen
Templates
Sonstiges
 
 

Weist den Initialwerten von statischen Variablen einen zur Kompilierzeit konstanten Wert zu.

Inhalt

[bearbeiten] Erklärung

Eine konstante Initialisierung wird in folgenden Fällen durchgeführt:

  • Initialisierung eines Objekts vom POD-Typ mit statischer Speicherklasse mit einem konstanten Ausdruck.
(bis C++11)
  • ein lvalue, das ein Objekt mit statischer Speicherklasse bezeichnet.
  • ein temporäres Objekt.
  • ein Teilobjekt eines temporären Objekts.
  • eine Funktion.
  • Initialisierung eines Objekts mit statischer oder Thread-Speicherklasse, wobei eine der folgenden Bedingungen erfüllt ist:
  • Wenn das Objekt durch einen Konstruktoraufruf initialisiert wird, wobei der Initialisierungs-vollständige Ausdruck ein konstanter Ausdruck ist, mit der Ausnahme, dass er auch constexpr Konstruktoren für das Objekt und seine Teilobjekte aufrufen darf (auch wenn diese Objekte von Klassen sind, die keine Literal-Typen sind).
  • Andernfalls ist entweder das Objekt wertinitialisiert oder jeder vollständige Ausdruck, der in seinem Initialisierer auftritt, ist ein konstanter Ausdruck.
(seit C++11)
(bis C++17)
(seit C++17)
(bis C++20)
(seit C++20)

Die Auswirkungen der konstanten Initialisierung sind die gleichen wie die Auswirkungen der entsprechenden Initialisierung, außer dass garantiert ist, dass sie abgeschlossen ist, bevor irgendeine andere Initialisierung eines statischen oder Thread-lokalen(seit C++11) Objekts beginnt.

[bearbeiten] Anmerkungen

Dem Compiler ist es gestattet, andere statische und Thread-lokale(seit C++11) Objekte mittels konstanter Initialisierung zu initialisieren, wenn er garantieren kann, dass der Wert derselbe wäre, als ob die Standardreihenfolge der Initialisierung befolgt worden wäre.

Die konstante Initialisierung geschieht normalerweise, wenn das Programm in den Speicher geladen wird, als Teil der Initialisierung der Laufzeitumgebung des Programms.

[bearbeiten] Beispiel

#include <iostream>
#include <array>
 
struct S
{
    static const int c;
};
 
const int d = 10 * S::c; // not a constant expression: S::c has no preceding
                         // initializer, this initialization happens after const
const int S::c = 5;      // constant initialization, guaranteed to happen first
 
int main()
{
    std::cout << "d = " << d << '\n';
    std::array<int, S::c> a1; // OK: S::c is a constant expression
//  std::array<int, d> a2;    // error: d is not a constant expression
}

Ausgabe

d = 50

[bearbeiten] Defect reports

Die folgenden Verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.

DR angewendet auf Verhalten wie veröffentlicht Korrigiertes Verhalten
CWG 441 C++98 Referenzen konnten nicht konstant initialisiert werden wurden konstant initialisierbar gemacht
CWG 1489 C++11 Es war unklar, ob eine Wertinitialisierung
eines Objekts eine konstante Initialisierung sein konnte
es kann
CWG 1747 C++11 Die Bindung einer Referenz an eine Funktion konnte keine konstante Initialisierung sein es kann
CWG 1834 C++11 Die Bindung einer Referenz an ein xvalue konnte keine konstante Initialisierung sein es kann

[bearbeiten] Siehe auch