

新闻资讯
技术学院constexpr 表示编译期可求值,const 仅表示运行期不可修改;constexpr 要求初始化表达式必须在编译期完全求值且隐含 const,而 const 变量未必是编译期常量。
constexpr 表示“编译期可求值”,而 const 仅表示“运行期不可修改”——这是最核心的区别。
声明为 const 的变量,只要初始化表达式不是编译期常量,它就只是运行期的只读变量。比如:
int x = 42; const int a = x; // 合法,但 a 不是编译期常量 constexpr int b = x; // 错误!x 不是编译期常量
这里 a 是 const,但无法用在需要编译期常量的上下文中(如数组大小、模板非类型参数)。
编译期可计算,且隐含 const所有 constexpr 变量自动是 const 的,但它还额外要求:初始化表达式必须能在编译期完全求值。例如:
constexpr int c = 10 + 20; // ✅ 编译期算出 30 constexpr int d = std::sqrt(16); // C++20 起 ✅(若 sqrt 是 constexpr 版本) constexpr int e = rand(); // ❌ 运行期函数,不满足
注意:constexpr 函数或构造函数也需满足“在传入编译期常量时能返回编译期常量”这一约束。
const 常用于接口设计,表达“这个值我不会改”,比如函数参数、成员变量;constexpr 专用于需要编译期确定值的地方:数组长度、模板参数、static_assert 条件、case 标签等;constexpr 构造函数允许创建字面类型(literal type)的对象,并在编译期初始化;constexpr 支持更复杂的逻辑(如循环、动态内存分配),但前提是所有输入和路径都满足编译期求值条件。int arr[N]; 中的 N?只有 constexpr(或字面类型的 const 整型静态常量)可以;std::array?必须是 constexpr 或等价的编译期常量;const 允许,constexpr 不允许(除非是 C++23 的 relaxed constexpr 某些情况);const?是的,constexpr 变量一定是 const 的(但反过来不成立)。