Constexpr 隐式声明的函数

Constexpr implicitly declared functions

对于类型 T 的 class,编译器可以根据 class 生成以下成员:

在 C++14 和 C++17 中,导致编译器生成这些函数的 constexpr 版本的规则是什么?

规则很简单:如果生成的定义满足 constexpr 函数的要求,那么它 将是 一个 constexpr 函数。例如,从 C++17 开始,[class.ctor]/7:

If that user-written default constructor would satisfy the requirements of a constexpr constructor (10.1.5), the implicitly-defined default constructor is constexpr.

围绕隐式默认构造函数的措辞是根据 "user-written default constructor" 的外观来描述的。所以 "that user-written default constructor" 表示 "what the compiler generates".

copy/move 构造函数存在类似的措辞。

赋值运算符的措辞稍微复杂一些,但归结为同一件事。该类型必须是文字类型,并且选择为每个子对象(非静态数据成员和基数 class)执行 copy/move 的赋值运算符必须是 constexpr.