【问题标题】:Must a deleted constructor be private?已删除的构造函数必须是私有的吗?
【发布时间】:2019-03-19 00:48:26
【问题描述】:
class A
{
public:
    A() = default;
    A(const A&) = delete;
};

class A
{
public:
    A() = default;

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

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

【问题讨论】:

  • 我将我删除的函数公开,因为它向公众用户宣布它不能被默认构造(在你的情况下)。

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


【解决方案1】:

它们是不同的仅在生成的诊断程序方面。如果您将其设为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。我将我删除的函数公开,因为它向公众用户宣布它不能被默认构造(在 OP 的情况下)。
  • @Nawaz 是的,因此它也可以被视为类的接口/文档的一部分。
【解决方案2】:

我想扩展Daniel Frey's answer。我宁愿给这些方法一个访问修饰符,而不是使删除的方法总是 public,如果它们不被删除,你会(假设)给这些方法。 (我不喜欢 always,以防程序员有选择。如果确实会刻意制作删除方法public,它应该由语言本身强制执行。)

一些经验法则/指南:

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

在所有情况下,您都向班级的适当用户而不是班级的所有用户发布通知。

【讨论】:

    猜你喜欢
    • 2019-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-13
    • 2014-09-25
    • 1970-01-01
    相关资源
    最近更新 更多