一、C++11 中的 constexpr
1. 常量表达式与 constexpr 概念
现代 C++ 从 C++11 开始引入 constexpr,旨在将计算任务从运行时转移到编译时。常量表达式是指值在编译期就能确定的表达式,比如字面量或常量初始化。
const int a = 1; // a 是常量表达式
const int b = a + 1; // b 也是
int c = 1;
const int d = c; // d 不是,因为 c 的值可能在运行前被修改
编译器会对常量表达式进行优化,直接替换为数值。通过汇编对比可以发现,使用常量表达式的代码在运行时不再包含计算逻辑。
constexpr 关键字用于指定变量必须是常量表达式。它修饰的变量必须用常量或常量表达式初始化,否则编译报错。
注意:
const分为顶层 const(对象本身不可变)和底层 const(指向的对象不可变)。指针被 const 修饰时,*左侧为底层 const,右侧为顶层 const。
2. constexpr 修饰函数
C++11 中,constexpr 函数默认是 inline 的,但限制极其严格:
- 参数和返回值必须是字面类型(整型、浮点型、指针等)。
- 函数体只能有一条
return语句。 - 不能有局部变量、循环或条件分支。
- 必须有返回值且为常量表达式。
只有当结果被 constexpr 变量接收时,才会触发编译期计算;否则退化为普通函数调用。
constexpr int func1() {
return 1;
}
constexpr int func2(int x) {
return x + 10;
}
int main() {
constexpr int a = ();
b = ();
std::cout << a << std::endl;
std::cout << b << std::endl;
;
}


