所以,我的问题很简单:
将默认类构造函数指定为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
如果可能,等等?
答案 0 :(得分:15)
2未定义为已删除的显式默认函数可以 只有在隐含声明的情况下才能声明
constexpr
为constexpr
。如果函数在其第一个上明确默认 声明,
- 如果隐式声明是和
,则隐含地认为它是constexpr
- 它具有相同的异常规范,就好像它已被隐式声明([except.spec])。
3如果使用a声明显式默认的函数 不兼容的异常规范([except.spec]) 隐式声明的异常规范,然后
如果该函数在其第一个声明中明确默认,则将其定义为已删除;
否则,该程序格式不正确。
换句话说,foo() = default;
,它必然是foo
默认构造函数的第一个声明,如果可能的话,将是&#34; constexpr
&#34;和#34; noexcept
如果可能&#34;。明确撰写constexpr
和noexcept
仍然有用;如果不能constexpr
/ noexcept
&#34;那就意味着对我大喊大叫。