【发布时间】:2019-11-09 22:52:46
【问题描述】:
虽然对构造函数使用 =default 对我来说很清楚(即强制编译器在存在其他 ctor 的情况下创建默认构造函数),但我仍然无法理解这两种析构函数之间的区别:
- 那些使用 =default 的人
- 那些没有明确定义并由编译器自动生成的。
我唯一想到的是 group-1 析构函数可以定义为虚拟的,但 group-2 始终是非虚拟的。那么,这就是他们之间的唯一区别吗?有没有编译器不生成析构函数,而是使用=default强制编译器生成的场景?
附言我在stackoverflow中检查了很多问题,但没有一个回答我的问题。这里有一些相关的问题。
- Difference between =default and {} ctos/destructors
- Defaulting virtual destructors
- Difference between =default and empty dtrs
编辑 1:This Q 关于 SO,专注于禁用默认移动构造函数,这可以被视为已接受答案中提到的项目之一。
【问题讨论】:
-
默认使用虚拟或纯虚拟析构函数是我所知道的仅有的两种适用情况。
-
析构函数本身对于
= default的行为与省略它相同;但是声明的存在抑制了移动构造函数和移动赋值的隐式生成 -
那些由编译器隐式生成的将需要完整的类型,如果您正在创建
pimpl类,这是不可能的。然后,您可以在pimpl类型完成后,在实现中声明~X();并执行~X() = default;。 -
其他情况:您希望成为
protected或private。您希望将其放入 .cpp 文件中,这样它就不会被内联。 -
@Aconcagua 我认为主要区别是在使用 =default 或 {} 时是微不足道和非微不足道的,如此答案中所述:stackoverflow.com/a/13578720/896012
标签: c++ c++11 destructor