はじめに
C++にはconst
constexpr
consteval
constinit
とかコンストがいっぱいあります。
今回ここでは、C++20から登場した consteval
キーワードの使い方について紹介します。
C++20 consteval関数 (即時関数)
C++11から使用できるconstexpr関数は実行時だけでなく、コンパイル時にも評価できる関数でした。
constexpr int add(int a, int b)
{
return a + b;
}
int main()
{
constexpr int sumA = add(0, 1); // コンパイル時評価
static_assert(sumA == 1);
int sumB = add(0, 1); // 実行時評価
}
これに対してconsteval関数はコンパイル時にのみ評価できます。
consteval int add(int a, int b)
{
return a + b;
}
int main()
{
constexpr int sumA = add(0, 1); // コンパイル時評価
static_assert(sumA == 1);
// int sumB = add(0, 1); // 実行時評価はコンパイルエラー
}
メタプログラミングで使う関数など、実行時に評価する想定のない物はconstevalにしておくほうが安全かもしれません
C++23 if consteval
C++23から新しいconstevalの使い方が登場します。
それが if consteval です。
if constevalでは、コンパイル時評価されるときと実行時評価されるときで条件分岐することができます。
constexpr int nahankanna()
{
if consteval {
// コンパイル時評価された場合はここを通る
return 33;
} else {
// 実行時評価された場合はここを通る
return 4;
}
}
int main()
{
constexpr int marines = nahankanna();
int tigers = nahankanna();
std::cout << marines << " - " << tigers << std::endl;
}
if !consteval
と逆判定にする事も可能です。
constexpr int nahankanna()
{
if !consteval {
// 実行時評価された場合はここを通る
return 33;
} else {
// コンパイル時評価された場合はここを通る
return 4;
}
}
C++20では std::is_constant_evaluated()
関数を使って同様なことができました
constexpr int nahankanna()
{
if (std::is_constant_evaluated()) {
// コンパイル時評価された場合はここを通る
return 33;
} else {
// 実行時評価された場合はここを通る
return 4;
}
}
またよく似たもので if constexpr
がC++17から使用できます。
こちらは、コンパイル時に条件分岐する文法でした。
template<bool isMarines>
constexpr int nahankanna()
{
// 条件分岐をコンパイル時に行う
if constexpr (isMarines) {
return 33;
} else {
return 4;
}
}
まとめ
C++20から登場したconsteval
キーワードの使い方を紹介しました。
- consteval関数
- if consteval
なんでや!阪神関係ないやろ!