我想阻止我的班级用户将其用作自动变量,所以我写这样的代码:
class A {
private:
~A() = default;
};
int main() {
A a;
}
我希望代码不会被编译,但是g ++会编译它而不会出错。
但是,当我将代码更改为:
时class A {
private:
~A(){}
};
int main() {
A a;
}
现在,g ++给出了~A()
是私有的错误,这是我的期望。
“= default”析构函数和空析构函数之间有什么区别?
答案 0 :(得分:24)
你的第一个例子不应该编译。这表示编译器中的编译错误。此错误已在gcc 4.9及更高版本中修复。
在这种情况下,使用= default
定义的析构函数是琐碎的。可以使用std::is_trivially_destructible<A>::value
检测到这一点。
<强>更新强>
C ++ 11(和C ++ 14)声明,如果有一个用户声明的析构函数(如果你没有用户声明的移动特殊成员),然后,隐式生成复制构造函数和复制赋值运算符仍然会发生,但不推荐使用该行为。这意味着如果您依赖它,您的编译器可能会给您一个弃用警告(或可能不会)。
这两种:
~A() = default;
和
~A() {};
是用户声明的,因此它们在这一点上没有区别。如果您使用这些表单中的任何一种(并且不要声明移动成员),则应明确默认,显式删除或显式提供复制成员,以避免依赖已弃用的行为。
如果您确实声明了移动成员(有或没有声明析构函数),则隐式删除复制成员。