所以,我的问题很简单:
将默认类构造函数指定为noexcept
或constexpr
(或任何其他您可以想到的东西)有什么意义吗?
struct foo
{
foo() = default;
// vs
constexpr foo() noexcept = default;
// same thing would apply for copy/move ctors and assignment operators
};
两个人的行为会一样吗?
这取决于该类是否为POD吗?例如,在上面的例子中,两者的行为方式相同,而如果例如我有一个在类分配中使用的私有成员std::vector<int> v = { 1, 2, 3, 4 };
,则默认情况下foo() = default;
不是noexcept
,也不是constexpr
。
通过编写foo() = default;
,编译器是否只是选择了最好的版本:如果可能,noexcept
和constexpr
,等等?
[dcl.fct.def.default]/2-3:
2未定义为已删除的显式默认函数可能仅当它本来是隐式声明的时候才声明为
constexpr
作为CCD_ 11。如果函数在其第一个申报,
- 如果隐式声明将被隐式地认为是CCD_
- 它具有与隐式声明的异常规范相同的异常规范([except.spec])
3如果显式默认的函数用与不兼容的异常规范(〔except.spec〕)隐式声明的异常规范,然后
如果函数在其第一个声明中显式默认,则将其定义为已删除;
否则,该程序就是格式错误的。
换句话说,foo() = default;
必然是foo
默认构造函数的第一个声明,它将是"constexpr
if possible"one_answers"noexcept
if possibility"。显式地写入constexpr
和noexcept
仍然是有用的;意思是"如果不能是constexpr
/noexcept
就对我大喊大叫"。