尽管对构造函数使用= default很简单(即在存在其他ctor的情况下强制编译器创建默认构造函数),但我仍然无法理解这两种析构函数之间的区别:
我唯一想到的是group-1析构函数可以定义为虚拟的,而group-2始终是非虚拟的。那么,这是它们之间的唯一区别吗?是否有任何情况下编译器没有生成析构函数,但是使用= default会强制编译器生成析构函数?
p.s。我在stackoverflow中检查了很多Q,但是没有一个回答我的Q。这是一些相关的问题。
答案 0 :(得分:2)
(以下几点已经在评论或链接的问题中提到;此答案用于组织和相互关联。)
当然有三种获取“简单析构函数”的方法:
struct Implicit {};
struct Empty {~Empty() {}};
struct Defaulted {~Defaulted()=default;};
与默认(而非复制或移动)构造函数一样,{}
和=default;
对析构函数的含义大致相同。那么Defaulted
的有趣属性就是与其他两者不同的那些(组合)。
与Empty
的主要区别很简单:显式默认的析构函数可以简单。仅当在类内部默认使用它时才适用,因此在离线定义中{}
和=default;
之间没有区别。类似地,虚拟化消除了任何区别,就像使任何成员或基类具有非平凡的析构函数一样。还有一个区别是,可以将显式默认的析构函数隐式地定义定义为已删除。这两个属性都与隐式声明的析构函数共享,因此我们也必须与它们区别。
与Implicit
(显式默认的析构函数禁止移动操作)相比,可以声明为private
,protected
或noexcept(false)
,并且在C ++ 20中可以被约束(但consteval
除外)。可以将其声明为constexpr
以非常肯定地验证它是否正确。声明为inline
并没有任何作用。 (它也可以是脱机的或虚拟的,但如上所述,这并不是使用它的理由。)
因此答案是“当您想要具有其他特殊属性的琐碎(或可能被删除)的析构函数时” —最有用的是访问控制或noexcept
状态。