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层),可通过编译选项调整:

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

相关推荐
syagain_zsx4 小时前
WebSocket 教程:websocketpp 写 echo 服务端
linux·网络·c++·websocket·网络协议·工具库
大陈子编程5 小时前
C++ CSP-J 与 CSP-S 题单:洛谷 140 题知识点全覆盖
c++
张小姐的猫5 小时前
【MySQL】数据类型
android·linux·数据库·c++·mysql·adb·php
讳疾忌医丶5 小时前
编译器眼中的 C++ 循环:从指针别名、IEEE 754 结合律到 SIMD 语义证明
开发语言·c++
小徐不徐说6 小时前
C++ 机器视觉入门:从零搭建 AOI 开发环境(OpenCV + CMake)
开发语言·c++·opencv
誰能久伴不乏6 小时前
【无标题】
c++·qt·机器人
大陈子编程6 小时前
C++ 背包九讲:从入门到精通的动态规划专题
开发语言·c++·动态规划
努力实干19 小时前
面向对象设计原则——C++
开发语言·c++·数码相机
syagain_zsx1 天前
jsoncpp 使用指南:编译链接、Json::Value 取值与高频坑
c++·json·库·http格式
布莱克6051 天前
理解 = delete 与 = default:两种赋值语义的差异
c++