【一人 C++20 Advent Calendar 2019】constinit 指定子を追加【15日目】

一人 C++20 Advent Calendar 2019 15日目の記事になります。

constinit 指定子を追加

constinit 指定子を使用すると初期化のみをコンパイル時に処理されることを保証することが出来ます。
constinit 指定子は静的またはスレッド記憶域期間を持つ変数に対して使用することが出来ます。
constexpr とは違い変数自体はコンパイル時に処理されません。

constexpr int
sqr(int n) {
    return n * n;
}

// value の初期化はコンパイル時に行われる
// 静的またはスレッド記憶域期間を持つ変数に対して使用できる
// この時に右辺はコンパイル時に解決できる式でなければならない
// ただし、value 自体は constexpr とは扱われない
static constinit int value = sqr(3);

// OK: value は不変ではないので再代入可能
value = 42;

// NG: value はコンパイル時に解決出来ないのでエラー
static_assert(value == 9);

// NG: value はコンパイル時に解決出来ないのでエラー
constexpr auto value2 = sqr(value);

これも consteval と同じように結構使いどころが難しそうですねえ。