名前空間
変種
操作

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

提供: cppreference.com
< cpp‎ | language
 
 
C++言語
一般的なトピック
フロー制御
条件付き実行文
繰り返し文 (ループ)
ジャンプ文
関数
関数宣言
ラムダ関数宣言
inline 指定子
例外指定 (C++20未満)
noexcept 指定子 (C++11)
例外
名前空間
指定子
decltype (C++11)
auto (C++11)
alignas (C++11)
記憶域期間指定子
初期化
代替表現
リテラル
ブーリアン - 整数 - 浮動小数点
文字 - 文字列 - nullptr (C++11)
ユーザ定義 (C++11)
ユーティリティ
属性 (C++11)
typedef 宣言
型エイリアス宣言 (C++11)
キャスト
暗黙の変換 - 明示的な変換
static_cast - dynamic_cast
const_cast - reinterpret_cast
メモリ確保
クラス
クラス固有の関数特性
特別なメンバ関数
テンプレート
その他
 
 
  • consteval - 関数が即時関数である、すなわち、その関数のすべての呼び出しがコンパイル時定数を生成しなければならないことを指定します。

目次

[編集] 説明

consteval 指定子は関数または関数テンプレートが即時関数である、すなわち、その関数のすべての潜在的に評価される (即ち、未評価文脈以外の) 呼び出しが (直接または間接的に) コンパイル時定数式を生成しなければならないことを指定します。 デストラクタ、確保関数、または解放関数には適用できません。 consteval 指定子は inline を暗黙に含みます。 同じ宣言指定子の並びの中では constexprconsteval、および constinit 指定子のいずれか1つのみが使用できます。 関数または関数テンプレートの宣言のいずれかが consteval 指定子を含む場合、その関数または関数テンプレートのすべての宣言がその指定子を含まなければなりません。

即時関数は constexpr 関数であり、場合によっては constexpr 関数または constexpr コンストラクタに適用可能な要件を満たさなければなりません。

最も内側の非ブロックスコープが即時関数の関数引数スコープでない即時関数の潜在的に評価される呼び出しは定数式を生成しなければなりません。 そのような呼び出しは即時呼び出しと言います。

consteval int sqr(int n) {
  return n*n;
}
constexpr int r = sqr(100);  // OK。
 
int x = 100;
int r2 = sqr(x);  // エラー、呼び出しが定数を生成しません。
 
consteval int sqrsqr(int n) {
  return sqr(sqr(n)); // この時点では定数式ではありませんが、 OK です。
}
 
constexpr int dblsqr(int n) {
  return 2*sqr(n); // エラー、囲っている関数が consteval でなく、 sqr(n) が定数ではありません。
}

即時関数を表す識別子式は即時関数の部分式内または即時関数の文脈内でのみ使用できます。 即時関数へのポインタまたは参照を取ることはできますが、定数式評価を脱出することはできません。

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、即時関数へのポインタは定数式の結果として許されません。

[編集] キーワード

consteval

[編集]

[編集] 関連項目