16
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

C++Advent Calendar 2023

Day 15

constevalの紹介

Last updated at Posted at 2023-12-14

はじめに

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

なんでや!阪神関係ないやろ!

16
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?