使用virtual destructor=default和空函数体的析构函数有什么区别吗?

9
一个什么也不做的虚析构函数是
virtual ~ClassName() {}

自C++11起,我们可以使用另一种说法
virtual ~ClassName() = default;

这两个有什么区别吗?

@Rakete1111:实际上这不是重复问题,因为另一个问题是关于默认析构函数是公有的,而这个问题是关于为什么在带有虚成员函数的基类中使用= default而不是{}的虚析构函数。我也在想同样的事情,即编译器是否可以通过= default以不同的方式进行优化,或者它是否只是更符合C ++11的惯用法。毕竟要输入相当多的字符。 - Masseman
@Masseman 当然,它们并不完全等价。但是它们问的是同一个问题,我应该在析构函数中使用{}还是= default;?虚析构函数并不重要,因为这不是问题所在。 - Rakete1111
1个回答

6
主要区别在于默认函数有规则,规定了它们被删除的情况(参见ISO c++14(N4296) 8.4、12.1、12.4、12.8)。

8.4.2.5:显式默认函数和隐式声明函数统称为默认函数,实现应为它们提供隐式定义(12.1、12.4、12.8),这可能意味着将它们定义为已删除。

例如:

12.4.5:如果类X的默认析构函数满足以下条件,则定义为已删除:(5.1) - X是一个类似于union的类,其中具有非平凡析构函数的变体成员,(5.2) - 任何可能构造的子对象都具有类类型M(或其数组),并且M具有已删除的析构函数或从默认析构函数无法访问的析构函数,(5.3) - 或者对于虚拟析构函数,非数组释放函数的查找结果存在二义性或者是一个已删除的函数或从默认析构函数无法访问的函数。

如果您的用途属于已删除的类别之一,则使用default将等同于使用delete,而{}则不会。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接