所以,我的问题很简单:
将默认类构造函数指定为noexcept或constexpr(或任何其他可能的东西)是否有任何意义?
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
2未定义为已删除的显式默认函数
constexpr只有在隐式声明为已声明的情况下才可以声明constexpr.如果函数在其第一个声明中明确默认,
- 它隐含地被认为是
constexpr隐含的声明是,和,- 它具有相同的异常规范,就好像它已被隐式声明([except.spec]).
3如果使用异常规范([except.spec])使用隐式声明的异常规范声明显式默认的函数 ,则
如果函数在其第一个声明中明确默认,则将其定义为已删除;
否则,该计划是不正确的.
换句话说,foo() = default;它必然foo是默认构造函数的第一个声明,将是" constexpr如果可能"和" noexcept如果可能".明确写作constexpr并且noexcept仍然有用; 它意味着"如果它不能constexpr/ noexcept" 就会对我大喊大叫.