constexpr関数とif constexpr
constexprでコードをコンパイル時に評価し、if constexprで分岐します。
「constexpr関数とif constexpr」はCoddyKit上の無料C++ Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC++ Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C++ Academyコースには全4レッスンが含まれています。
コンパイル時評価
constexprキーワードは、「可能な場合はこれをコンパイル時に評価する」ことをコンパイラーに伝えます。コンパイル時の計算には実行時コストがかかりません。
constexpr変数
constexpr変数は、定数式で初期化する必要があります。結果はコンパイル時に確定します。
constexpr int BUFFER_SIZE = 1024;
constexpr double PI = 3.14159265358979;constexpr関数
関数にconstexprを付けると、定数引数で呼び出した場合にコンパイル時に実行できるようになります。
constexpr int factorial(int n) {
return (n <= 1) ? 1 : n * factorial(n - 1);
}
constexpr int five_fact = factorial(5); // computed at compile time実行時のフォールバック
constexpr関数は実行時の値でも呼び出せます。その場合は実行時に実行されます。
int n = read_input();
int result = factorial(n); // runtime callconstexpr関数の制限
C++14より前:
- return文は1つだけ
- ループは使用不可
- ローカル状態の変更は不可
C++14でこれらの制限が緩和され、C++17とC++20でもさらに機能が追加されました(try-catch、動的確保、仮想関数など)。
consteval(C++20)
constevalを使うと、コンパイル時評価を強制できます。consteval関数を非定数の引数で呼び出すとエラーになります。
consteval int square(int x) { return x * x; }
constexpr int c = square(5); // OK
int x = 5;
// int r = square(x); // ERRORconstinit(C++20)
constinitは、変数がコンパイル時に初期化されることを保証しますが、実行時の変更は許可します。
if constexpr(C++17)
if constexprはコンパイル時の分岐です。選択されなかった分岐はコンパイルすらされないため、テンプレートで役立ちます。
template <typename T>
void print(const T& value) {
if constexpr (std::is_pointer_v<T>) {
std::cout << "pointer: " << *value;
} else {
std::cout << value;
}
}SFINAEの排除
if constexprは、複雑なSFINAEパターンを明確な条件分岐に置き換えます。型traitsと組み合わせることで、ジェネリックコードがはるかに読みやすくなります。
コンパイル時アルゴリズム
現代的なC++では、文字列のハッシュ化、テーブル生成、ミニパーサーなど、驚くほど複雑なアルゴリズムを完全にコンパイル時に実行するよう記述できます。
constexpr auto fnv1a(std::string_view s) {
uint32_t h = 2166136261u;
for (char c : s) {
h = (h ^ static_cast<uint8_t>(c)) * 16777619u;
}
return h;
}
constexpr auto x = fnv1a("hello");テンプレートとconstexpr
ジェネリックなconstexpr関数は強力な組み合わせです。型に柔軟なジェネリックコードを記述し、コンパイル時に評価できます。
診断
constexprコードのコンパイル時エラーでは、詳細な位置情報が報告されます。現代のコンパイラーは、問題のある処理をかなり正確に特定できます。
クイックチェック
if constexprは通常のifにはないどのような動作をしますか。
まとめ
constexprはコンパイル時評価を可能にし、constevalはそれを強制し、constinitはコンパイル時の初期化を保証します。if constexprはコンパイル時に分岐し、選択されなかった分岐はインスタンス化されないため、多くの場合SFINAEを置き換えられます。
よくある質問
「constexpr関数とif constexpr」レッスンは無料ですか?
はい。「constexpr関数とif constexpr」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C++ Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C++ Academyコースには全4レッスンが含まれています。
「constexpr関数とif constexpr」で何を学びますか?
constexprでコードをコンパイル時に評価し、if constexprで分岐します。 ブラウザで直接実行するハンズオンコードでC++ Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
C++ Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのC++ Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「constexpr関数とif constexpr」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このC++ Academyレッスンでコードを書いて実行できますか?
はい。すべてのC++ Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- 関数テンプレートとクラステンプレート再入門
- テンプレート特殊化:部分特殊化と完全特殊化
- 可変長テンプレートとパラメーターパック
- constexpr関数とif constexpr