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层),可通过编译选项调整:
bash
g++ -fconstexpr-depth=1000 main.cpp
版本差异
| 特性 | C++11 | C++14+ | C++20 |
|---|---|---|---|
| 函数体复杂度 | 单条语句 | 允许循环 | 进一步扩展 |
| 虚函数支持 | 不支持 | 不支持 | 支持 |
成员函数隐式const |
是 | 否 | 否 |
示例对比
合法(C++14+):
cpp
constexpr int sum(int n) {
int total = 0;
for (int i = 0; i < n; ++i) {
total += i;
}
return total;
}
非法:
cpp
constexpr int* create() {
int* p = new int(10); // 动态内存分配
return p;
}
合法(C++20):
cpp
struct Base {
virtual constexpr int get() { return 1; }
};
编程语言C++www.share.parkxh.com++C语言的魅力
编程语言C++www.share.mshxue.net++C语言的魅力
编程语言C++www.share.hhjtep.com++C语言的魅力
编程语言C++www.share.enneragram.com++C语言的魅力
编程语言C++www.share.ccynyk.com++C语言的魅力
编程语言C++www.share.dongmiandaojia.com++C语言的魅力
编程语言C++www.share.sunzhihuiyd.com++C语言的魅力
编程语言C++www.share.whxhby.net++C语言的魅力
编程语言C++www.share.lunwenpingshen.com++C语言的魅力
编程语言C++www.share.lcfxnyidx.com++C语言的魅力
编程语言C++www.share.zhaimeiti.com++C语言的魅力
编程语言C++www.share.19kc.cn++C语言的魅力
编程语言C++www.share.bangnitesw.com++C语言的魅力
编程语言C++www.share.acbrick.com++C语言的魅力
编程语言C++www.share.xjzcxgy.com++C语言的魅力
编程语言C++www.share.dydff.com++C语言的魅力
编程语言C++www.share.febjt.com++C语言的魅力
编程语言C++www.share.miliriben.com++C语言的魅力
编程语言C++www.share.xmyhjc.com++C语言的魅力
编程语言C++www.share.ankezt.com++C语言的魅力
编程语言C++www.share.huniupipe.com++C语言的魅力
编程语言C++www.share.dboyxym.com++C语言的魅力
编程语言C++www.share.chrlly.com++C语言的魅力
编程语言C++share.longjigo.com++C语言的魅力
编程语言C++share.xatjfg.com++C语言的魅力
编程语言C++share.baogehuii.com++C语言的魅力
编程语言C++share.hnsaxf119.com++C语言的魅力
编程语言C++share.hdmxw.com++C语言的魅力
编程语言C++share.7caiu.com++C语言的魅力
编程语言C++share.wuxiwjk.com++C语言的魅力
编程语言C++share.parkxh.com++C语言的魅力
编程语言C++share.mshxue.net++C语言的魅力
编程语言C++share.hhjtep.com++C语言的魅力
编程语言C++share.enneragram.com++C语言的魅力
编程语言C++share.ccynyk.com++C语言的魅力
编程语言C++share.dongmiandaojia.com++C语言的魅力
编程语言C++share.sunzhihuiyd.com++C语言的魅力
编程语言C++share.whxhby.net++C语言的魅力
编程语言C++share.lunwenpingshen.com++C语言的魅力
编程语言C++share.lcfxnyidx.com++C语言的魅力
编程语言C++share.zhaimeiti.com++C语言的魅力
编程语言C++share.19kc.cn++C语言的魅力
编程语言C++share.bangnitesw.com++C语言的魅力
编程语言C++share.acbrick.com++C语言的魅力
编程语言C++share.xjzcxgy.com++C语言的魅力
编程语言C++share.dydff.com++C语言的魅力
编程语言C++share.febjt.com++C语言的魅力
编程语言C++share.miliriben.com++C语言的魅力
编程语言C++share.xmyhjc.com++C语言的魅力
编程语言C++share.ankezt.com++C语言的魅力
编程语言C++share.huniupipe.com++C语言的魅力
编程语言C++share.dboyxym.com++C语言的魅力
编程语言C++share.chrlly.com++C语言的魅力