名前空間
変種
操作

constinit 指定子 (C++20以上)

提供: cppreference.com
< cpp‎ | language
 
 
 
 
  • constinit - 変数が静的初期化 (すなわちゼロ初期化および定数初期化) されなければならず、そうでなければプログラムは ill-formed であることを指定します。

目次

[編集] 説明

constinit 指定子は静的またはスレッド記憶域期間を持つ変数を宣言します。 変数が constinit 付きで宣言された場合、その初期化の宣言constinit で適用されなければなりません。 constinit 付きで宣言された変数が動的初期化を行う場合、プログラムは ill-formed です。 初期化の宣言の時点で到達可能な constinit 宣言がない場合、プログラムは ill-formed です (診断は要求されません)。

constinitconstexpr または consteval と一緒に使用することはできません。 宣言される変数が参照のときは、 constinitconstexpr と同等です。 宣言される変数がオブジェクトのときは、 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); // エラー

constinitthread_local 変数が既に初期化済みであることをコンパイラに伝えるために非初期化宣言で使用することもできます。

extern thread_local constinit int x;
int f() { return x; } // ガード変数のチェックは不要です。

[編集] キーワード

constinit

[編集]

[編集] 関連項目