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

C++ 已删除的构造函数必须是私有的吗?,c++,c++11,constructor,standards,access-rights,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; }; GCC 4.8的以下额外输出结果: class A { publi

这两个定义在任何情况下都是相同的吗?

它们是不同的,只是与产生的诊断结果不同。如果将其设置为私有,则会报告额外的、多余的访问冲突:

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

class A
{
public:
    A() = default;

private:
    A(const A&) = delete;
};
GCC 4.8的以下额外输出结果:

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

int main()
{
    A a;
    A a2=a;
}
因此,我建议总是将删除的方法
公开

我想扩展。与其总是将已删除的方法
公开
,我宁愿给这些方法一个访问修饰符,如果它们不被删除,您(假设)会给它们一个访问修饰符。(我不喜欢总是以防程序员有选择。如果确实要将删除的方法
公开
,那么应该由语言本身强制执行。)

一些经验法则/指南:

  • 在大多数情况下,复制和移动赋值运算符将在具体类和抽象类中公开
  • 在大多数情况下,复制和移动构造函数将在具体类中公开
  • 在大多数情况下,复制和移动构造函数将在抽象类中受到
    保护
  • 复制和移动构造函数将是具体的
    final
    类中的
    private
    ,在大多数情况下只能由
    friends
    实例化

在所有情况下,您都会向类的相应用户而不是类的所有用户发布公告。

我会将已删除的函数公开,因为这是向公开用户发布的公告,说明它不能默认构造(在您的情况下)。+1。我将我删除的函数公之于众,因为这是对公共用户的一个声明,它不能被默认构造(在OP的情况下)。@Nawaz Right,因此它也可以被视为类的接口/文档的一部分。
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;
          ^