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语言的魅力

相关推荐
磊 子8 小时前
STL之deque和list以及两者与vector的对比
开发语言·c++·list
郝学胜_神的一滴8 小时前
CMake 012:Linux 下动态库与可执行程序的单文件构建
c++·cmake
小poop9 小时前
操作符详解:从入门到精通
c++
山上三树9 小时前
C/C++ 高频报错速查表(开发通用版)
c语言·开发语言·c++
Tian_Hang9 小时前
Factory Method | 工厂方法
开发语言·c++
elseif12310 小时前
【C++】vector 详细版
开发语言·c++·算法
cany100010 小时前
C++ -- 原子变量
c++
cany100011 小时前
C++ -- 队列std::queue
开发语言·c++
周末也要写八哥11 小时前
C++中单线程方式之无脑上锁
java·开发语言·c++
cany100011 小时前
C++ -- 动态内存分配和释放(new/delete)
开发语言·c++