18

我读了这个问题,但对我来说仍然没有多大意义。它仍然听起来更像是糖衣功能。

有什么区别:

class A 
{
// public/private ?
    A (const A&) = delete; 
};

class A 
{
private:
    A (const A&); // MISSING implementation
};

相同的operator=或其他功能。

4

3 回答 3

22

一个区别是=delete允许编译时错误,而在某些情况下,没有定义的声明仅在链接时被捕获(此时错误消息通常不会指向问题的根源)。一种这样的情况是当您添加一个成员函数来尝试复制A. 即使它不是 的成员函数A,关于 copy-ctor 存在的错误消息private也没有使用=delete.

为避免混淆,我建议您使用已删除的功能public,否则您会收到额外的误导性错误消息。

于 2013-09-17T10:59:55.143 回答
12

不同之处在于=delete代码的目的是明确的。将函数声明为private/ 不可访问是一个技巧。尽管大多数人都知道,但它产生的错误是模糊的(链接/访问级别错误而不是代码中的语义问题 - 即“您正在使用已删除的函数”)。

于 2013-09-17T10:59:27.743 回答
3

一个区别是,如果类(或朋友)试图摧毁自己,老式的形式会给出未定义的行为。在类成员和朋友中,析构函数是可访问的,因此如果使用它就不会出现编译时错误。相反,您违反了单一定义规则。在实践中,这将导致链接错误,但正式行为是未定义的。

如果在任何情况下都需要该函数,则删除构造函数(或其他函数)会导致编译错误;并更明确地说明意图,允许编译器提供更好的诊断信息。当函数由于其他内容被删除而被隐式删除时,这尤其有用。

于 2013-09-17T11:15:41.517 回答