consteval 指定子 (C++20以上)
提供: cppreference.com
consteval
- 関数が即時関数である、すなわち、その関数のすべての呼び出しがコンパイル時定数を生成しなければならないことを指定します。
目次 |
[編集] 説明
consteval
指定子は関数または関数テンプレートが即時関数である、すなわち、その関数のすべての潜在的に評価される (即ち、未評価文脈以外の) 呼び出しが (直接または間接的に) コンパイル時定数式を生成しなければならないことを指定します。 デストラクタ、確保関数、または解放関数には適用できません。 consteval
指定子は inline
を暗黙に含みます。 同じ宣言指定子の並びの中では constexpr
、 consteval
、および 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、即時関数へのポインタは定数式の結果として許されません。
[編集] キーワード
[編集] 例
This section is incomplete Reason: no example |