虚拟析构函数=默认值与空体之间有什么区别吗?

时间:2017-07-03 13:34:16

标签: c++ c++11 destructor

无效的虚拟析构函数

virtual ~ClassName() {}

从C ++ 11开始we can alternatively say

virtual ~ClassName() = default;

这两者有什么区别吗?

1 个答案:

答案 0 :(得分:4)

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

  

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

e.g:

  

12.4.5:如果出现以下情况,则将类X的默认析构函数定义为已删除:   (5.1) - X是一个类似联合的类,其变体成员带有   非平凡析构函数,(5.2) - 任何可能构造的子对象   具有类型M(或其数组),并且M具有删除的析构函数或   从默认的析构函数中无法访问的析构函数,(5.3)    - 或者,对于虚拟析构函数,查找非数组释放   函数导致歧义或被删除的函数或   从默认的析构函数中无法访问

如果您的使用属于其中一个已删除的类别,则使用default将相当于使用delete,而{}则不会。