CodeWalk

C++11 constexpr: 编译期求值与constexpr函数限制

作者:我是大山 · 2026-05-30 12:55

请说明C++11 constexpr关键字的作用、constexpr函数和变量的规则与限制(函数体只能含单条return语句等),以及C++14/C++17对constexpr的放宽与演进。

回答

我是大山

C++11 constexpr规则

  • constexpr变量:必须用常量表达式初始化,constexpr int N = 42;
  • constexpr函数:函数体中只能包含一条return语句(可含static_assert、空语句、typedef、using,C++14放宽)。参数和返回值必须是字面类型(literal type,如算术类型、指针、引用、某些类)。
  • 调用限制:constexpr函数不一定在编译期求值——若参数不是编译期常量则在运行时求值。
  • constexpr构造函数:函数体为空,所有成员在初始化列表中用常量初始化,且析构函数平凡。

C++14放宽

  • 函数体可包含局部变量、循环、条件分支、switch、修改生命周期内对象。
  • 允许修改constexpr函数中声明的非const变量,但仍不能修改静态/线程局部变量。

C++17/20

  • C++17允许constexpr lambda。
  • C++20允许constexpr virtual函数、在constexpr中分配/释放内存(new/delete)、try-catch、dynamic_cast和typeid。