删除的构造函数必须是私有的吗?

时间:2013-09-21 09:40:06

标签: c++ c++11 constructor standards access-rights

class A
{
public:
    A() = default;
    A(const A&) = delete;
};

class A
{
public:
    A() = default;

private:
    A(const A&) = delete;
};

在任何情况下,这两个定义是否总是相同?

2 个答案:

答案 0 :(得分:36)

它们与产生的诊断不同 。如果您将其设为private,则会报告其他多余的访问冲突:

class A
{
public:
    A() = default;
private:
    A(const A&) = delete;
};

int main()
{
    A a;
    A a2=a;
}

从GCC 4.8获得以下附加输出:

main.cpp: In function 'int main()':
main.cpp:6:5: error: 'A::A(const A&)' is private
     A(const A&) = delete;
     ^
main.cpp:12:10: error: within this context
     A a2=a;
          ^

因此我建议总是删除方法public

答案 1 :(得分:7)

我想延长Daniel Frey's answer。如果不删除这些方法,我宁愿给这些方法提供访问修饰符(假设)给出这些方法,而不是删除方法 public。 (我不喜欢总是以防程序员有一个选项。如果它确实可以用来制作删除的方法public,那么它应该由语言本身强制执行。)< / p>

一些经验法则/指南:

  • 对于大多数情况,复制和移动赋值运算符将在具体和抽象类中为public
  • 对于大多数情况,在具体类中复制和移动构造函数将为public
  • 对于大多数情况,在抽象类中复制和移动构造函数将为protected
  • 复制和移动构造函数将private在具体final类中,只有friends 才能在大多数情况下实例化

在所有情况下,您都会向某个类的相应用户发布通知,而不是向所有类用户发布通知。