何时使用= default将析构函数设为默认值?

时间:2019-06-27 22:30:56

标签: c++ c++11 destructor

尽管对构造函数使用= default很简单(即在存在其他ctor的情况下强制编译器创建默认构造函数),但我仍然无法理解这两种析构函数之间的区别:

  1. 使用= default的人
  2. 未明确定义且由编译器自动生成的那些。

我唯一想到的是group-1析构函数可以定义为虚拟的,而group-2始终是非虚拟的。那么,这是它们之间的唯一区别吗?是否有任何情况下编译器没有生成析构函数,但是使用= default会强制编译器生成析构函数?

p.s。我在stackoverflow中检查了很多Q,但是没有一个回答我的Q。这是一些相关的问题。

  1. Difference between =default and {} ctos/destructors
  2. Defaulting virtual destructors
  3. Difference between =default and empty dtrs

1 个答案:

答案 0 :(得分:2)

(以下几点已经在评论或链接的问题中提到;此答案用于组织和相互关联。)

当然有三种获取“简单析构函数”的方法:

struct Implicit {};
struct Empty {~Empty() {}};
struct Defaulted {~Defaulted()=default;};

与默认(而非复制或移动)构造函数一样,{}=default;对析构函数的含义大致相同。那么Defaulted的有趣属性就是与其他两者不同的那些(组合)。

Empty的主要区别很简单:显式默认的析构函数可以简单。仅当在类内部默认使用它时才适用,因此在离线定义中{}=default;之间没有区别。类似地,虚拟化消除了任何区别,就像使任何成员或基类具有非平凡的析构函数一样。还有一个区别是,可以将显式默认的析构函数隐式地定义定义为已删除。这两个属性都与隐式声明的析构函数共享,因此我们也必须与它们区别。

Implicit(显式默认的析构函数禁止移动操作)相比,可以声明为privateprotectednoexcept(false),并且在C ++ 20中可以被约束(但consteval除外)。可以将其声明为constexpr以非常肯定地验证它是否正确。声明为inline并没有任何作用。 (它也可以是脱机的或虚拟的,但如上所述,这并不是使用它的理由。)

因此答案是“当您想要具有其他特殊属性的琐碎(或可能被删除)的析构函数时” —最有用的是访问控制或noexcept状态。

相关问题