consteval
- 指定函数是立即函数(immediate function),即每次调用该函数必须产生编译时常量。
解释
consteval
说明符声明函数或函数模板为立即函数,即该函数的每次潜在求值的调用(即不求值语境外的调用)必须(直接或间接)产生编译时常量表达式。它不可应用于析构函数、分配函数或解分配函数。consteval
说明符蕴含 inline
。同一声明说明符序列中允许出现至多一个 constexpr
、 consteval
及 constinit
说明符。若某个函数或函数模板的任何声明含有 consteval
说明符,则该函数或函数模板的所有声明必须均含该说明符。
立即函数是 constexpr 函数,而且只要情况符合,必须满足适用于 constexpr 函数或 constexpr 构造函数的要求。
当最内层的非块作用域不是某个立即函数的函数形参作用域时,对立即函数的潜在求值的调用必须产生常量表达式;这种调用称为立即调用( immediate invocation )。
- 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(); // 非良构:指向立即函数的指针不是常量表达式的容许结果
关键词
示例
本节未完成原因:暂无示例 |
当前内容版权归 cppreference 或其关联方所有,如需对内容或内容相关联开源项目进行关注与资助,请访问 cppreference .