Constant initialization
Setzt die Anfangswerte der static Variablen auf einen Compile-Time-Konstanten.
Inhaltsverzeichnis |
Erklärung
Konstanteninitialisierung wird in den folgenden Fällen durchgeführt:
|
(bis C++11) |
|
(seit C++11)
(bis C++17) |
|
(seit C++17)
(bis C++20) |
|
(seit C++20) |
Die Effekte der Konstanteninitialisierung sind die gleichen wie die Effekte der entsprechenden Initialisierung, mit der Ausnahme, dass garantiert ist, dass sie abgeschlossen ist, bevor irgendeine andere Initialisierung eines statischen oder thread-lokalen (since C++11) Objekts beginnt.
Hinweise
Dem Compiler ist es erlaubt, andere statische und thread-lokale (since C++11) Objekte mittels Konstanteninitialisierung zu initialisieren, falls garantieren kann, dass der Wert derselbe wäre wie bei Befolgung der standardmäßigen Initialisierungsreihenfolge.
Konstanteninitialisierung erfolgt normalerweise, wenn das Programm in den Speicher geladen wird, als Teil der Initialisierung der Laufzeitumgebung des Programms.
Beispiel
#include <iostream> #include <array> struct S { static const int c; }; const int d = 10 * S::c; // kein konstanter Ausdruck: S::c hat keinen vorausgehenden // Initialisierer, diese Initialisierung erfolgt nach const const int S::c = 5; // konstante Initialisierung, garantiert zuerst durchgeführt int main() { std::cout << "d = " << d << '\n'; std::array<int, S::c> a1; // OK: S::c ist ein konstanter Ausdruck // std::array<int, d> a2; // Fehler: d ist kein konstanter Ausdruck }
Ausgabe:
d = 50
Fehlerberichte
Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | Angewendet auf | Verhalten wie veröffentlicht | Korrektes Verhalten |
|---|---|---|---|
| CWG 441 | C++98 | Referenzen konnten nicht konstant initialisiert werden | konstant initialisierbar gemacht |
| CWG 1489 | C++11 |
es war unklar, ob die Wertinitialisierung
eines Objekts eine konstante Initialisierung sein kann |
kann sie |
| CWG 1747 | C++11 | das Binden einer Referenz an eine Funktion konnte nicht konstant initialisiert werden | kann es |
| CWG 1834 | C++11 | das Binden einer Referenz an einen xvalue konnte nicht konstant initialisiert werden | kann es |