constinit 指定子 (C++20以上)
提供: cppreference.com
目次 |
[編集] 説明
constinit
指定子は静的またはスレッド記憶域期間を持つ変数を宣言します。 変数が constinit
付きで宣言された場合、その初期化の宣言は constinit
で適用されなければなりません。 constinit
付きで宣言された変数が動的初期化を行う場合、プログラムは ill-formed です。 初期化の宣言の時点で到達可能な constinit
宣言がない場合、プログラムは ill-formed です (診断は要求されません)。
constinit
は constexpr
または consteval
と一緒に使用することはできません。 宣言される変数が参照のときは、 constinit
は constexpr
と同等です。 宣言される変数がオブジェクトのときは、 constexpr
はそのオブジェクトが静的初期化および定数破棄されなければならないことを義務化し、そのオブジェクトを const 修飾化しますが、 constinit
は定数破棄および const 修飾を義務化しません。 結果として、 constexpr コンストラクタを持ち constexpr デストラクタを持たない型 (std::shared_ptr<T> など) のオブジェクトは、 constinit
で宣言することはできますが constexpr
ではできません。
const char *g() { return "dynamic initialization"; } constexpr const char *f(bool p) { return p ? "constant initializer" : g(); } constinit const char *c = f(true); // OK // constinit const char *d = f(false); // エラー
constinit
は thread_local
変数が既に初期化済みであることをコンパイラに伝えるために非初期化宣言で使用することもできます。
extern thread_local constinit int x; int f() { return x; } // ガード変数のチェックは不要です。
[編集] キーワード
[編集] 例
This section is incomplete Reason: no example |