执行之间是否有区别:
X() = default;
和
constexpr X() = default;
默认构造常量表达式中的类工作正常,这两个例子之间有区别吗?我应该使用一个吗?
答案 0 :(得分:30)
由于隐式构造函数在您的情况下实际上是constexpr
...
[C++11: 12.1/6]:
[..] 如果用户编写的默认构造函数满足constexpr
构造函数(7.1.5)的要求,则隐式定义的默认构造函数是constexpr
。 [..]
[C++11: 7.1.5/3]:
constexpr
函数的定义应满足以下约束条件:
- 它不应是虚拟的(10.3);
- 其返回类型应为文字类型;
- 每个参数类型都应为文字类型;
- 其功能正文
= delete
,= default
或仅包含复合声明
- null语句,
- static_assert-声明
typedef
声明和 alias-declarations ,它们没有定义类或枚举,- 使用-声明,
- using指令,
- 和一个return语句;
- 初始化返回值(6.6.3,8.5)时使用的每个构造函数调用和隐式转换都应该是常量表达式(5.19)中允许的那些之一。
......声明实际上是等同的:
[C++11: 8.4.2/2]:
明确默认的函数只有在被隐式声明为constexpr
时才可以声明为constexpr
,并且可能有一个明确的异常规范仅当它与异常规范兼容(15.4)时 在隐含声明上。 如果某个功能在其第一个声明中明确默认,
- 如果隐式声明为,则隐含地认为是
constexpr
,- 隐含地认为它具有相同的异常规范,就像它已被隐式声明(15.4)和
一样- 对于复制构造函数,移动构造函数,复制赋值运算符或移动赋值运算符,它应具有与隐式声明的相同的参数类型。
这样做也没关系。
在一般情况下,如果你肯定想要一个构造函数为constexpr
,那么保留关键字是明智的,这样如果它不符合标准,你至少会得到编译器错误;如果没有实现它,你可能会得到一个非constexpr
构造函数。