名前空間
変種
操作

consteval 指定子 (C++20以降)

From cppreference.com
< cpp‎ | language
 
 
C++言語
全般
フロー制御
条件実行文
if
繰り返し文 (ループ)
for
範囲for (C++11)
ジャンプ文
関数
関数宣言
ラムダ式
inline指定子
動的例外仕様 (C++17まで*)
noexcept指定子 (C++11)
例外
名前空間
指定子
const/volatile
decltype (C++11)
auto (C++11)
constexpr (C++11)
consteval (C++20)
constinit (C++20)
記憶域期間指定子
初期化
代替表現
リテラル
ブーリアン - 整数 - 浮動小数点数
文字 - 文字列 - nullptr (C++11)
ユーザー定義 (C++11)
ユーティリティ
属性 (C++11)
typedef宣言
型エイリアス宣言 (C++11)
キャスト
メモリ確保
クラス
クラス固有の関数プロパティ
explicit (C++11)
static

特殊メンバ関数
テンプレート
その他
 
 
  • consteval - 関数が「即時関数」であることを指定します。つまり、その関数へのすべての呼び出しはコンパイル時定数を生成しなければなりません。

目次

[編集] 解説

consteval 指定子は、関数または関数テンプレートを「即時関数」として宣言します。つまり、その関数へのすべての潜在的に評価される呼び出しは、(直接的または間接的に)コンパイル時定数式を生成しなければなりません。

即時関数はconstexpr 関数であり、場合によってはその要件に従います。constexpr と同様に、consteval 指定子は inline を含意します。ただし、デストラクタ、アロケーション関数、またはデロケーション関数には適用できません。

consteval を指定する関数または関数テンプレートの宣言は、constexpr を同時に指定することはできません。また、その関数または関数テンプレートの再宣言も consteval を指定しなければなりません。

即時関数の潜在的に評価される呼び出しで、その最も内側の非ブロックスコープが即時関数の関数パラメータスコープまたはconsteval if ステートメントのtrue分岐(C++23以降)ではない場合、定数式を生成しなければなりません。このような呼び出しは「即時呼び出し」として知られています。

consteval int sqr(int n)
{
    return n*n;
}
constexpr int r = sqr(100); // OK
 
int x = 100;
int r2 = sqr(x);            // Error: Call does not produce a constant
 
consteval int sqrsqr(int n)
{
    return sqr(sqr(n));     // Not a constant expression at this point, but OK
}
 
constexpr int dblsqr(int n)
{
    return 2 * sqr(n);      // Error: Enclosing function is not consteval
                            // and sqr(n) is not a constant
}

即時関数を示す識別子式は、即時呼び出しのサブ式内、または「即時関数コンテキスト」(上記で述べたコンテキスト、即時関数への呼び出しが定数式である必要がないコンテキスト)内でのみ出現できます。即時関数へのポインタまたは参照を取得できますが、定数式評価からエスケープすることはできません。

consteval int f() { return 42; }
consteval auto g() { return &f; }
consteval int h(int (*p)() = g()) { return p(); }
constexpr int r = h();  // OK
constexpr auto e = g(); // ill-formed: a pointer to an immediate function is
                        // not a permitted result of a constant expression

[編集] 注釈

機能テストマクロ 規格 機能
__cpp_consteval 201811L (C++20) 即時関数
202211L (C++23)
(DR20)
consteval を上位に伝播させる

[編集] キーワード

consteval

[編集]

#include <iostream>
 
// This function might be evaluated at compile-time, if the input
// is known at compile-time. Otherwise, it is executed at run-time.
constexpr unsigned factorial(unsigned n)
{
    return n < 2 ? 1 : n * factorial(n - 1);
}
 
// With consteval we enforce that the function will be evaluated at compile-time.
consteval unsigned combination(unsigned m, unsigned n)
{
    return factorial(n) / factorial(m) / factorial(n - m);
}
 
static_assert(factorial(6) == 720);
static_assert(combination(4, 8) == 70);
 
int main(int argc, const char*[])
{
    constexpr unsigned x{factorial(4)};
    std::cout << x << '\n';
 
    [[maybe_unused]]
    unsigned y = factorial(argc); // OK
//  unsigned z = combination(argc, 7); // error: 'argc' is not a constant expression
}

出力

24

[編集] 関連項目

constexpr 指定子(C++11) 変数または関数の値をコンパイル時に計算できることを指定する[編集]
constinit 指定子(C++20) 変数が静的初期化、すなわちゼロ初期化定数初期化を持つことを表明する。[編集]
ない コンパイル時に評価可能なを定義する
English 日本語 中文(简体) 中文(繁體)