默认情况下是默认的构造函数/赋值noexcept/constexpr



所以,我的问题很简单:

将默认类构造函数指定为noexceptconstexpr(或任何其他您可以想到的东西)有什么意义吗?

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;,编译器是否只是选择了最好的版本:如果可能,noexceptconstexpr,等等?

[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"。显式地写入constexprnoexcept仍然是有用的;意思是"如果不能是constexpr/noexcept就对我大喊大叫"。

最新更新