c++ “= default”析构函数和空析构函数之间有什么区别?

我想阻止我的类的用户使用它作为一个自动变量,所以我写这样的代码:

class A {
private:
  ~A() = default;
};

int main() {
  A a;
}

我期望代码不会被编译,但是g编译它没有错误。

但是,当我将代码更改为:

class A {
private:
  ~A(){}
};

int main() {
  A a;
}

现在,g给出〜A()是私有的错误,我的期望也是如此。

“= default”析构函数和空析构函数有什么区别?

你的第一个例子不应该编译。这代表编译器中编译的错误。这个bug在gcc 4.9及更高版本中是修复的。

在这种情况下,使用= default定义的析构函数是微不足道的。这可以用std :: is_trivially_destructible< A> :: value来检测。

更新

C 11(和C 14)声明如果有一个用户声明的析构函数(如果没有用户声明的移动特殊成员),则隐式生成复制构造函数和复制赋值运算符仍然发生,但是该行为已被弃用。意思是,如果你依赖它,你的编译器可能会给你一个废弃警告(或者可能不会)。

都:

~A() = default;

和:

~A() {};

是用户声明的,所以在这一点上没有任何区别。如果您使用这些表单(并且不声明移动成员),则应显式地默认,显式删除或显式提供您的副本成员,以避免依赖不推荐使用的行为。

如果您声明移动成员(有或没有声明析构函数),则会隐式删除副本成员。

http://stackoverflow.com/questions/27762221/whats-the-difference-between-default-destructor-and-empty-destructor

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:c++ “= default”析构函数和空析构函数之间有什么区别?