C++ 面试题:C++中 constexpr 函数的限制有哪些?

constexpr 的限制

字面类型要求

参数和返回类型必须是字面类型。字面类型包括:

  • 基本类型(intcharbool等)
  • 引用类型(必须绑定到字面类型)
  • 数组类型(元素必须是字面类型)
  • 字面值类(所有非静态成员为字面类型,且有constexpr构造函数)
  • void(C++14起)
  • 部分标准库类型(如std::arraystd::string_view

非字面类型示例:

  • std::string(动态内存分配)
  • 带有虚函数的类(C++20前)
  • 包含非字面类型成员的类
禁止的操作
  • 动态内存分配(new/delete
  • 异常处理(throwtry-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语言的魅力

相关推荐
无限进步_1 小时前
【C++】从红黑树到 map 和 set:封装设计与迭代器实现
开发语言·数据结构·数据库·c++·windows·github·visual studio
handler011 小时前
速通蓝桥杯省一:二分算法
c语言·开发语言·c++·笔记·算法·职场和发展·蓝桥杯
汉克老师2 小时前
GESP5级C++考试语法知识(十六、分治算法(三))
c++·算法·分治算法·汉诺塔·逆序对·gesp5级·gesp五级
hele_two2 小时前
SDL2设置透明度
c++·图形渲染
小杰3122 小时前
网络框架源码阅读技巧
服务器·网络·c++·reactor·zlmediakit·zltoolkit
叼烟扛炮2 小时前
C++ 知识点12 构造函数
开发语言·c++·算法·构造函数
满天星83035772 小时前
定长内存池ObjectPool
数据结构·c++·算法·链表
叼烟扛炮2 小时前
C++第八讲:string 类
开发语言·c++·算法·string
MOONICK2 小时前
bit7z压缩与解压
c++