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

相关推荐
小王C语言16 分钟前
【8.进行接口测试】:通过 curl 进行接口自动化测试 / 通过 python 程序进行接口自动化测试
网络·c++
888CC++1 小时前
C++ 快速学习指南:从入门到进阶的实战路线
开发语言·c++
小小晓.1 小时前
C++记:函数
开发语言·c++·算法
驱动小百科2 小时前
Windows运行库合集下载 VC++、DirectX、.NET运行库安装教程
c++·windows·.net·windows运行库合集下载·windows运行库安装
charlie1145141913 小时前
Cinux —— 给物理内存建账本:bitmap 物理内存管理器
开发语言·c++·操作系统·开源项目
2301_777998346 小时前
Linux线程同步与互斥(三):信号量与环形队列实现生产者消费者模型
linux·c语言·c++
啦啦啦啦啦zzzz6 小时前
设计模式:单例模式和工厂模式
c++·单例模式·设计模式·工厂模式
Henry Zhu1236 小时前
C++ 动态多态详解
c++
此生决int6 小时前
深入理解C++系列(06)——模版初阶与STL
开发语言·c++
c238566 小时前
《枚举算法 “翻译官”:用 enum class 给 “游游的礼盒” 算分》
c语言·c++·算法