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

Dei*_*Dei 13 c++ c++11 c++14

所以,我的问题很简单:

将默认类构造函数指定为noexceptconstexpr(或任何其他可能的东西)是否有任何意义?

struct foo
{
   foo() = default;
   // vs
   constexpr foo() noexcept = default;

   // same thing would apply for copy/move ctors and assignment operators
};
Run Code Online (Sandbox Code Playgroud)

两者的行为方式是否相同?

这取决于课程是否为POD?例如,使用上面的示例,两者的行为方式相同,而如果我有一个std::vector<int> v = { 1, 2, 3, 4 };使用类内赋值的私有成员,则foo() = default;默认情况下noexcept不会constexpr.

通过编写foo() = default;,编译器只选择最佳版本:noexcept如果可能,constexpr如果可能,等等?

T.C*_*.C. 17

[dcl.fct.def.default]/2-3:

2未定义为已删除的显式默认函数constexpr只有在隐式声明为已声明的情况下才可以声明constexpr.如果函数在其第一个声明中明确默认,

  • 它隐含地被认为是constexpr隐含的声明是,和,
  • 它具有相同的异常规范,就好像它已被隐式声明([except.spec]).

3如果使用异常规范([except.spec])使用隐式声明的异常规范声明显式默认的函数 ,则

  • 如果函数在其第一个声明中明确默认,则将其定义为已删除;

  • 否则,该计划是不正确的.

换句话说,foo() = default;它必然foo是默认构造函数的第一个声明,将是" constexpr如果可能"和" noexcept如果可能".明确写作constexpr并且noexcept仍然有用; 它意味着"如果它不能constexpr/ noexcept" 就会对我大喊大叫.

  • 认为向人们解释其语法是“foo() noexcept = default”会有所帮助,如 https://en.cppreference.com/w/cpp/language/noexcept_spec 所示 (2认同)