【发布时间】:2018-12-22 18:08:00
【问题描述】:
我知道,而不是写作:
class A {
public:
A(A&&) noexcept = default;
};
最好写
class A {
public:
A(A&&) noexcept;
};
inline A::A(A&&) noexcept = default;
我听说的原因是:
避免构造函数变成
deleted。如果无法定义函数,编译器会报错。移动构造函数被声明为
noexcept,即使某些成员字段的移动构造函数没有使用noexcept注解。
有人能详细解释一下这些差异背后的理论吗?
【问题讨论】:
-
我可以验证第一点是正确的:为了尽早发现编译错误,最好在类定义中使用
default(参见godbolt.org/g/36iQb8)。 -
@bipll 是真的。相信我。
-
我在玩过上面链接中的代码后观察到,在类定义中,无论如何都会生成默认构造函数,在类中的时候声明默认构造函数将“按需”生成,如果在代码中使用。但我对理论一无所知,无论是否指定了这种行为。
-
@bipll 我能找到的唯一参考资料可能在这里:akrzemi1.wordpress.com/2015/09/11/…
-
此行为在 [dcl.fct.def.default] 中描述。如果使用与隐式声明的特殊成员将具有的显式异常规范不匹配的显式异常规范声明特殊成员函数,则 (a) 如果在第一个声明中(即在类定义中)使用
=default,则它是与=delete的含义相同,或者(b) 如果=default用于稍后的声明(在类定义之外),则程序格式错误。看起来相关措辞将从 C++17 更改为 C++20,但两个版本中的异常规范都是正确的。
标签: c++ default-constructor noexcept