我读了this个问题,但它对我来说仍然没有多大意义。它听起来更像是糖衣特征。
有什么区别:
class A
{
// public/private ?
A (const A&) = delete;
};
和
class A
{
private:
A (const A&); // MISSING implementation
};
operator=
或其他功能相同。
答案 0 :(得分:19)
一个区别是=delete
允许编译时错误,而在某些情况下,没有定义的声明仅在链接时(在哪个错误消息通常不会指向您问题的来源)。其中一种情况是当您添加试图复制A
实例的成员函数时。即使它不是A
的成员函数,关于复制文件private
的错误消息也不如使用=delete
那样清晰。
为避免混淆,我建议您删除已删除的功能public
,否则会收到其他误导性错误消息。
答案 1 :(得分:11)
不同之处在于=delete
代码的目的是明确的。将函数声明为private
/不可访问是一个技巧。虽然大多数人都知道它,但它产生的错误是模糊的(链接/访问级别错误而不是代码中的语义问题 - 即“你正在使用已删除的函数”)。
答案 2 :(得分:3)
一个区别是,如果班级(或朋友)试图摧毁自己,那么老式的形式会给出未定义的行为。在类成员和朋友中,析构函数是可访问的,因此如果使用它就没有编译时错误。相反,您违反了One Definition Rule。实际上,这会导致链接错误,但正式的行为是未定义的。
如果在任何情况下需要该函数,则删除构造函数(或其他函数)会导致编译错误;并更明确地陈述意图,允许编译器提供更好的诊断消息。当由于删除其他内容而隐式删除函数时,这尤其有用。