命名空间
变体
操作

consteval 规范 (自 C++20 起)

来自 cppreference.com
< cpp‎ | 语言
 
 
C++ 语言
 
 
  • consteval - 指定函数为立即函数,即对函数的每次调用都必须生成编译时常量

内容

[编辑] 解释

consteval 规范声明函数或函数模板为立即函数,即对函数的每次潜在求值调用都必须(直接或间接)生成编译时常量表达式

立即函数是一个constexpr 函数,根据情况受其要求约束。与constexpr 一样,consteval 规范意味着inline。但是,它不能应用于析构函数、分配函数或释放函数。

指定consteval 的函数或函数模板声明不能也指定constexpr,并且该函数或函数模板的任何重新声明也必须指定consteval

对立即函数的潜在求值调用,其最内层非块作用域不是立即函数的函数参数作用域consteval if 语句的真分支(自 C++23 起),必须生成常量表达式;这种调用称为立即调用

consteval int sqr(int n)
{
    return n*n;
}
constexpr int r = sqr(100); // OK
 
int x = 100;
int r2 = sqr(x);            // Error: Call does not produce a constant
 
consteval int sqrsqr(int n)
{
    return sqr(sqr(n));     // Not a constant expression at this point, but OK
}
 
constexpr int dblsqr(int n)
{
    return 2 * sqr(n);      // Error: Enclosing function is not consteval
                            // and sqr(n) is not a constant
}

表示立即函数的标识符表达式只能出现在立即调用的子表达式中,或出现在立即函数上下文中(即上面提到的上下文,其中对立即函数的调用不需要是常量表达式)。可以获取指向立即函数的指针或引用,但它们不能逃离常量表达式求值。

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: a pointer to an immediate function is
                        // not a permitted result of a constant expression

[编辑] 注释

特性测试 Std 特性
__cpp_consteval 201811L (C++20) 立即函数
202211L (C++20)
(DR)
使 consteval 向上传播

[编辑] 关键字

consteval

[编辑] 示例

#include <iostream>
 
// This function might be evaluated at compile-time, if the input
// is known at compile-time. Otherwise, it is executed at run-time.
constexpr unsigned factorial(unsigned n)
{
    return n < 2 ? 1 : n * factorial(n - 1);
}
 
// With consteval we enforce that the function will be evaluated at compile-time.
consteval unsigned combination(unsigned m, unsigned n)
{
    return factorial(n) / factorial(m) / factorial(n - m);
}
 
static_assert(factorial(6) == 720);
static_assert(combination(4, 8) == 70);
 
int main(int argc, const char*[])
{
    constexpr unsigned x{factorial(4)};
    std::cout << x << '\n';
 
    [[maybe_unused]]
    unsigned y = factorial(argc); // OK
//  unsigned z = combination(argc, 7); // error: 'argc' is not a constant expression
}

输出

24

[编辑] 另请参阅

constexpr 规范(C++11) 指定变量或函数的值可以在编译时计算[编辑]
constinit 说明符(C++20) 断言变量具有静态初始化,即 零初始化常量初始化[编辑]
常量表达式 定义一个可以在编译时计算的 表达式