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

时间:2015-01-04 04:00:45

标签: c++ class c++11 destructor private

我想阻止我的班级用户将其用作自动变量,所以我写这样的代码:

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

int main() {
  A a;
}

我希望代码不会被编译,但是g ++会编译它而不会出错。

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

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

int main() {
  A a;
}

现在,g ++给出了~A()是私有的错误,这是我的期望。

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

1 个答案:

答案 0 :(得分:24)

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

在这种情况下,使用= default定义的析构函数是琐碎的。可以使用std::is_trivially_destructible<A>::value检测到这一点。

<强>更新

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

这两种:

~A() = default;

~A() {};

用户声明的,因此它们在这一点上没有区别。如果您使用这些表单中的任何一种(并且不要声明移动成员),则应明确默认,显式删除或显式提供复制成员,以避免依赖已弃用的行为。

如果您确实声明了移动成员(有或没有声明析构函数),则隐式删除复制成员。