Konstante Initialisierung
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:
|
(bis C++11) |
|
(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 |