C++ 面试题:C++中 constexpr 函数的限制有哪些?
·
constexpr 的限制
字面类型要求
参数和返回类型必须是字面类型。字面类型包括:
- 基本类型(
int、char、bool等) - 引用类型(必须绑定到字面类型)
- 数组类型(元素必须是字面类型)
- 字面值类(所有非静态成员为字面类型,且有
constexpr构造函数) void(C++14起)- 部分标准库类型(如
std::array、std::string_view)
非字面类型示例:
std::string(动态内存分配)- 带有虚函数的类(C++20前)
- 包含非字面类型成员的类
禁止的操作
- 动态内存分配(
new/delete) - 异常处理(
throw或try-catch) - 调用非
constexpr函数 - 修改全局/静态变量
成员函数的特殊规则
- 虚函数:C++20前不允许,C++20起允许
- 隐式
const限定:C++11中constexpr成员函数隐式为const,C++14取消此限制
递归深度限制
编译器对constexpr递归深度有默认限制(如GCC默认为512层),可通过编译选项调整:
g++ -fconstexpr-depth=1000 main.cpp
版本差异
| 特性 | C++11 | C++14+ | C++20 |
|---|---|---|---|
| 函数体复杂度 | 单条语句 | 允许循环 | 进一步扩展 |
| 虚函数支持 | 不支持 | 不支持 | 支持 |
成员函数隐式const | 是 | 否 | 否 |
示例对比
合法(C++14+):
constexpr int sum(int n) {
int total = 0;
for (int i = 0; i < n; ++i) {
total += i;
}
return total;
}
非法:
constexpr int* create() {
int* p = new int(10); // 动态内存分配
return p;
}
合法(C++20):
struct Base {
virtual constexpr int get() { return 1; }
};
更多推荐

所有评论(0)