consteval 指定符 (C++20 起)

来自cppreference.com
< cpp‎ | language
  • consteval - 指定函数是立即函数,即每次调用该函数必须产生编译时常量。

目录

[编辑] 解释

consteval 指定符声明函数或函数模板为立即函数,即每次调用该函数必须(直接或间接)产生编译时常量表达式。它不可应用于析构函数、分配函数或解分配函数。 consteval 指定符蕴含 inlineconstevalconstexpr 指定符不能在同一声明指定符序列中一同出现。若函数或函数模板的任何声明含有 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();  // 病式:指向立即函数的指针不是常量表达式的容许结果

[编辑] 关键词

consteval

[编辑] 示例

[编辑] 参阅