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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- const変数とパラメータ
- constメンバ関数
- constexprとコンパイル時評価
- constevalとconstinit