定数初期化
From cppreference.com
静的変数の初期値をコンパイル時定数に設定します。
目次 |
[編集] 説明
定数初期化は以下のケースで実行されます。
|
(C++11まで) |
|
(C++11以降) (C++17まで) |
| (C++17以降) (C++20まで) | |
| (C++20以降) |
定数初期化の効果は対応する初期化の効果と同じですが、静的またはスレッドローカル(C++11以降)オブジェクトの他の初期化が始まる前に完了することが保証されます。
[編集] 注記
コンパイラは、標準の初期化順序に従った場合と同じ値になることを保証できる場合、他の静的およびスレッドローカル(C++11以降)オブジェクトを定数初期化で初期化することができます。
定数初期化は通常、プログラムのランタイム環境の初期化の一部として、プログラムがメモリにロードされるときに発生します。
[編集] 例
このコードを実行
#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 }
出力
d = 50
[編集] 欠陥報告
以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。
| DR | 適用対象 | 公開された動作 | 正しい動作 |
|---|---|---|---|
| CWG 441 | C++98 | 参照は定数初期化できなかった | 定数初期化可能になった |
| CWG 1489 | C++11 | 値初期化が定数初期化になるか不明だった オブジェクトの定数初期化 |
できる |
| CWG 1747 | C++11 | 関数への参照の束縛が定数初期化できなかった | できる |
| CWG 1834 | C++11 | xvalueへの参照の束縛が定数初期化できなかった | できる |