名前空間
変種
操作

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

提供: cppreference.com
< cpp‎ | language
 
 
 
 
  • 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

[編集]

[編集] 関連項目