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

时间:2016-03-22 17:24:34

标签: 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
};

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

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

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

1 个答案:

答案 0 :(得分:15)

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

  

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

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

3如果使用a声明显式默认的函数   不兼容的异常规范([except.spec])   隐式声明的异常规范,然后

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

  •   
  • 否则,该程序格式不正确。

  •   

换句话说,foo() = default;,它必然是foo默认构造函数的第一个声明,如果可能的话,将是&#34; constexpr&#34;和#34; noexcept如果可能&#34;。明确撰写constexprnoexcept仍然有用;如果不能constexpr / noexcept&#34;那就意味着对我大喊大叫。