文章目录
- [第一章 C++20核心语法特性](#第一章 C++20核心语法特性)
-
- [1.7 consteval 和 constinit](#1.7 consteval 和 constinit)
-
- [1.7.1 consteval 和 constinit作用](#1.7.1 consteval 和 constinit作用)
- [1.7.2 示例](#1.7.2 示例)
- [1.7.3 const constexpr consteval constinit 对比](#1.7.3 const constexpr consteval constinit 对比)
本文记录C++20新特性之consteval 和 constinit。
第一章 C++20核心语法特性
1.7 consteval 和 constinit
在 C++11 引入 constexpr 之后,编译期计算(Compile-time Computation)的大门被彻底打开。但是,constexpr 有时过于"宽容"------它既可以在编译期运行,也可以在运行期运行,这导致了语义上的模糊。
为了更精准地控制编译期行为,C++20 引入了两个新的关键字:consteval 和 constinit。它们分别解决了"强制编译期执行"和"强制编译期初始化"这两个痛点。
1.7.1 consteval 和 constinit作用
consteval 告诉编译器,只能在编译期间计算。
constinit:告诉编译器,修饰的变量只能在编译期间确定好。
1.7.2 示例
cpp
// consteval 声明:此函数必须在编译期完成计算
consteval int sqr(int n) {
return n * n;
}
void test()
{
// 1 传入编译期常量,
constexpr int r1 = sqr(33);
// 2 传入 constexpr
constexpr int x = 5;
constexpr int r2 = sqr(x);
// 3 传入非编译期常量,编译错误
int y = 10;
//int r3 = sqr(y); // 编译错误:必须在编译期求值
}

示例2:测试 constinit
cpp
constexpr int get_initial_value()
{
return 42;
}
// 1. constinit 保证 global_x 在编译期完成初始化
// 2. global_x 依然是可变的 (mutable)
constinit int global_x = get_initial_value();
// 错误示例:
int runtime_val = 100;
// constinit int err_val = runtime_val; // 编译错误!必须用常量表达式初始化
int test()
{
std::cout << "Initial: " << global_x << std::endl; // 输出 42
// 修改变量
global_x = 100;
std::cout << "Modified: " << global_x << std::endl; // 输出 100
return 2;
}
1.7.3 const constexpr consteval constinit 对比
对比:
