Constexpr隐式声明函数

5

对于类型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个回答

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

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

默认构造函数的措辞是描述“用户编写的默认构造函数”会长什么样子。所以,“那个用户编写的默认构造函数”意味着“编译器生成了什么”。复制/移动构造函数也有类似的措辞。
对于赋值运算符的措辞略微复杂,但归根结底是相同的。类型必须是字面量类型,并且为每个子对象(非静态数据成员和基类)选择用于复制/移动的赋值运算符必须是constexpr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接