C++11 constexpr: 编译期求值与constexpr函数限制
请说明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。