删除修饰符vs将声明函数声明为私有

时间:2013-09-17 10:55:44

标签: c++ c++11 private delete-operator

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

有什么区别:

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

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

operator=或其他功能相同。

3 个答案:

答案 0 :(得分:19)

一个区别是=delete允许编译时错误,而在某些情况下,没有定义的声明仅在链接时(在哪个错误消息通常不会指向您问题的来源)。其中一种情况是当您添加试图复制A实例的成员函数时。即使它不是A的成员函数,关于复制文件private的错误消息也不如使用=delete那样清晰。

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

答案 1 :(得分:11)

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

答案 2 :(得分:3)

一个区别是,如果班级(或朋友)试图摧毁自己,那么老式的形式会给出未定义的行为。在类成员和朋友中,析构函数是可访问的,因此如果使用它就没有编译时错误。相反,您违反了One Definition Rule。实际上,这会导致链接错误,但正式的行为是未定义的。

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