繁体   English   中英

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

[英]Is a defaulted constructor/assignment noexcept/constexpr by default?

所以,我的问题很简单:

将默认类构造函数指定为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等等?

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

2未被定义为删除的明确,违约函数可以声明constexpr只有它会被隐含声明为constexpr 如果函数在其第一个声明中明确默认,

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM