名前空間
変種
操作

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

提供: cppreference.com
< cpp‎ | language
 
 
C++言語
一般的なトピック
フロー制御
条件付き実行文
繰り返し文 (ループ)
ジャンプ文
関数
関数宣言
ラムダ関数宣言
inline 指定子
例外指定 (C++20未満)
noexcept 指定子 (C++11)
例外
名前空間
指定子
decltype (C++11)
auto (C++11)
alignas (C++11)
記憶域期間指定子
初期化
代替表現
リテラル
ブーリアン - 整数 - 浮動小数点
文字 - 文字列 - nullptr (C++11)
ユーザ定義 (C++11)
ユーティリティ
属性 (C++11)
typedef 宣言
型エイリアス宣言 (C++11)
キャスト
暗黙の変換 - 明示的な変換
static_cast - dynamic_cast
const_cast - reinterpret_cast
メモリ確保
クラス
クラス固有の関数特性
特別なメンバ関数
テンプレート
その他
 
 
  • 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

[編集]

[編集] 関連項目