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

xml*_*lmx 25 c++ standards constructor access-rights c++11

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

class A
{
public:
    A() = default;

private:
    A(const A&) = delete;
};
Run Code Online (Sandbox Code Playgroud)

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

Dan*_*rey 37

它们与产生的诊断不同.如果您这样做private,则会报告其他多余的访问冲突:

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

int main()
{
    A a;
    A a2=a;
}
Run Code Online (Sandbox Code Playgroud)

得到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;
          ^
Run Code Online (Sandbox Code Playgroud)

因此我建议总是制作删除的方法public.

  • +1.我将已删除的函数公开,因为它是公共用户**公告**它不能默认构造(在OP的情况下). (5认同)
  • @Nawaz是的,因此它也可以被视为类的接口/文档的一部分. (4认同)

Mat*_*ias 7

我想扩大Daniel Frey的答案。我宁愿给这些方法一个访问修饰符,而不是总是 使已删除的方法成为public可能(假设)如果不将其删除,则赋予它们。(我不总是希望程序员有选择权。如果确实将它刻在石头上以制成删除的方法public,则应该由语言本身来实施。)

一些经验法则/准则:

  • public在大多数情况下,复制和移动分配运算符将处于具体和抽象的类中。
  • public在大多数情况下,复制和移动构造函数将位于具体的类中。
  • protected在大多数情况下,复制和移动构造函数将位于抽象类中。
  • 复制和移动构造函数将private位于具体的final类中,friends 在大多数情况下只能实例化。

在所有情况下,您都向班级的适当用户而不是班级的所有用户进行公告。