对于类型为T的类,编译器可以生成以下成员,具体取决于类:
T::T()
T::T(const T&)
T::T(T&&)
T& T::operator=(const T&)
T& T::operator=(T&&)
在C ++ 14和C ++ 17中,编译器导致生成这些函数的constexpr
版本的规则是什么?
答案 0 :(得分:5)
规则很简单:如果生成的定义满足constexpr
函数的要求,则将 constexpr
函数。例如,来自C ++ 17,[class.ctor] / 7:
如果用户编写的默认构造函数满足constexpr构造函数(10.1.5)的要求,则隐式定义的默认构造函数为
constexpr
。
隐式默认构造函数的措辞是根据“用户编写的默认构造函数”的含义来描述的。所以“用户编写的默认构造函数”意味着“编译器生成的内容”。
复制/移动构造函数存在类似的措辞。
对于赋值运算符来说,措辞稍微复杂一些,但归结为同样的事情。类型必须是文字类型,并且为每个子对象(非静态数据成员和基类)执行复制/移动所选择的赋值运算符必须为constexpr
。