0Pricing
C++ Academy · レッスン

constevalとconstinit

現代的なコンパイル時キーワード

「constevalとconstinit」はCoddyKit上の無料C++ Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC++ Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C++ Academyコースには全4レッスンが含まれています。

constexpr の先へ

C++20 では、コンパイル時プログラミングをより明確にする 2 つのキーワードが追加されました。コンパイル時実行を保証する consteval と、コンパイル時初期化を保証する constinit です。

consteval:即時関数

consteval 関数は必ずコンパイル時に評価されます。constexpr とは異なり、実行時に実行されることはありません。

consteval int cube(int x) {
    return x * x * x;
}

int main() {
    constexpr int c = cube(3);   // OK: compile time
    return c;
}

consteval は実行時の呼び出しを拒否する

consteval 関数を実行時の値で呼び出すとコンパイルエラーになります。この保証は強制されます。

consteval int cube(int x) { return x * x * x; }

int main() {
    int n = 4;
    // int bad = cube(n);   // ERROR: n is not a constant
    return cube(2);
}

consteval を使う理由

実行時に計算しても意味がない場合に使ってください。たとえば、定数テーブルの生成やリテラルのコンパイル時検証などです。

constexpr と consteval の違い

constexpr 関数はコンパイル時に実行される場合がありますが、consteval 関数は必ずコンパイル時に実行されます。誤った実行時の使用を禁止したい場合は consteval を選んでください。

constinit:静的初期化の保証

constinit は、静的変数またはスレッドローカル変数がコンパイル時に初期化されることを保証し、静的初期化順序の問題を解消します。

constinit int globalCount = 10;   // initialized at compile time

int main() {
    return globalCount;
}

constinit は const ではない

constexpr とは異なり、constinit 変数はコンパイル時の初期化後も変更できます。制約するのは初期化方法だけです。

constinit int counter = 0;

int main() {
    counter = 5;   // OK: constinit allows mutation
    return counter;
}

初期化順序の問題を解決する

翻訳単位にまたがる非ローカル静的変数の場合、constinit によって静的(コンパイル時)初期化が強制されるため、動的初期化が実行される前に値が準備されます。

3 つのキーワードの比較

constexpr:コンパイル時になる場合があり、const です。consteval:必ずコンパイル時になります(関数)。constinit:コンパイル時初期化を強制しますが、変更可能なままです。

コンパイラーの対応

これらは C++20 の機能です。GCC/Clang では -std=c++20(またはそれ以降)を指定し、MSVC では /std:c++20 を指定してコンパイルしてください。

適切なツールを選ぶ

コンパイル時の計算を強制するには consteval を使い、静的初期化を確定的にするには constinit を使ってください。これらを組み合わせると、コンパイル時 C++ をより安全にできます。

確認テスト

consteval と constinit についての理解度を確認します。

まとめ

C++20 のキーワードである consteval(必ずコンパイル時に実行される関数)と constinit(静的変数に対するコンパイル時初期化の保証、ただし変更可能)を学びました。constexpr と合わせることで、コンパイル時評価を正確に制御できます。

よくある質問

「constevalとconstinit」レッスンは無料ですか?

はい。「constevalとconstinit」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C++ Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C++ Academyコースには全4レッスンが含まれています。

「constevalとconstinit」で何を学びますか?

現代的なコンパイル時キーワード ブラウザで直接実行するハンズオンコードでC++ Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

C++ Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのC++ Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「constevalとconstinit」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このC++ Academyレッスンでコードを書いて実行できますか?

はい。すべてのC++ Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. const変数とパラメータ
  2. constメンバ関数
  3. constexprとコンパイル時評価
  4. constevalとconstinit
← C++ Academyに戻る