Constant initialization
From cppreference.net
static 変数の初期値をコンパイル時定数に設定します。
目次 |
説明
定数初期化 は以下の場合に実行されます:
|
(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; // 定数式ではない: S::cには先行する初期化子がなく、 // この初期化はconstの後に発生する const int S::c = 5; // 定数初期化、最初に発生することが保証される int main() { std::cout << "d = " << d << '\n'; std::array<int, S::c> a1; // OK: S::cは定数式 // std::array<int, d> a2; // エラー: dは定数式ではない }
出力:
d = 50
不具合報告
以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。
| DR | 適用バージョン | 公開時の動作 | 正しい動作 |
|---|---|---|---|
| CWG 441 | C++98 | 参照は定数初期化できなかった | 定数初期化可能に変更 |
| CWG 1489 | C++11 | 値初期化が定数初期化となり得るか不明確だった | 定数初期化となり得る |
| CWG 1747 | C++11 | 関数への参照のバインドは定数初期化できなかった | 定数初期化可能 |
| CWG 1834 | C++11 | xvalueへの参照のバインドは定数初期化できなかった | 定数初期化可能 |