繁体   English   中英

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

[英]What's the difference between “= default” destructor and empty destructor?

我想阻止我的类的用户将它用作自动变量,所以我编写如下代码:

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

int main() {
  A a;
}

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

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

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

int main() {
  A a;
}

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

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

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

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

更新

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

都:

~A() = default;

和:

~A() {};

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM