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