Constexpr隐式声明函数

时间:2017-05-14 10:41:56

标签: constructor c++14 constexpr assignment-operator c++17

对于类型为T的类,编译器可以生成以下成员,具体取决于类:

  • 默认构造函数:T::T()
  • 复制构造函数:T::T(const T&)
  • 移动构造函数:T::T(T&&)
  • 复制赋值运算符:T& T::operator=(const T&)
  • 移动赋值运算符:T& T::operator=(T&&)

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

1 个答案:

答案 0 :(得分:5)

规则很简单:如果生成的定义满足constexpr函数的要求,则 constexpr函数。例如,来自C ++ 17,[class.ctor] / 7:

  

如果用户编写的默认构造函数满足constexpr构造函数(10.1.5)的要求,则隐式定义的默认构造函数为constexpr

隐式默认构造函数的措辞是根据“用户编写的默认构造函数”的含义来描述的。所以“用户编写的默认构造函数”意味着“编译器生成的内容”。

复制/移动构造函数存在类似的措辞。

对于赋值运算符来说,措辞稍微复杂一些,但归结为同样的事情。类型必须是文字类型,并且为每个子对象(非静态数据成员和基类)执行复制/移动所选择的赋值运算符必须为constexpr