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

Must a deleted constructor be private?

本文关键字:删除 构造函数      更新时间:2023-10-16
class A
{
public:
    A() = default;
    A(const A&) = delete;
};
class A
{
public:
    A() = default;
private:
    A(const A&) = delete;
};

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

它们只是在产生的诊断中有所不同。如果将其设为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.

我想扩展Daniel Frey的答案。与其让删除的方法总是public,我宁愿给这些方法一个访问修饰符,如果它们不被删除,你会(假设地)给这些方法。(我不喜欢总是以防程序员有选择。如果它确实被刻在石头上以使删除的方法public,它应该由语言本身强制执行。

一些经验法则/准则:

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

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

相关文章: