为什么要明确删除构造函数?

ash*_*ash 83 c++

何时/为什么我要显式删除我的构造函数?假设原因是为了防止其使用,为什么不做到呢private

class Foo
{ 
  public: 
    Foo() = delete; 
};
Run Code Online (Sandbox Code Playgroud)

谢谢!

Luc*_*ore 80

怎么样:

//deleted constructor
class Foo
{ 
  public: 
    Foo() = delete;     
  public:
    static void foo();
};

void Foo::foo()
{
   Foo f;    //illegal
}
Run Code Online (Sandbox Code Playgroud)

//private constructor
class Foo
{ 
  private: 
    Foo() {}     
  public:
    static void foo();
};

void Foo::foo()
{
   Foo f;    //legal
}
Run Code Online (Sandbox Code Playgroud)

它们基本上是不同的东西.private告诉你只有类的成员可以调用该方法或访问该变量(或当然是朋友).在这种情况下,static该类(或任何其他成员)的方法调用private类的构造函数是合法的.这不适用于已删除的构造函数.

这里有样品.

  • @mark是的,这将是C++ 98的做事方式.但恕我直言,明确传达意图实际上是一般编程中非常重要的事情.在这种情况下,一些读者可能会看到一个私有未定义的构造函数并假设它是偶然的,只是为它添加一个定义,特别是如果定义与默认构造函数一样简单(是的,有一个注释有帮助,但我们更喜欢编译器) - 对评论执行的强制执行).通过让我们的意图更清晰,我们还可以获得更好的错误消息,其中显示"明确删除"而不是"未定义的引用". (10认同)
  • 如果声明Foo(int),则根本不需要声明Foo().不会生成Foo(),因此无论如何Foo f都是无效的.因此,您的示例未显示已删除构造函数的情况.亲自看看 - http://ideone.com/mogiIF (3认同)
  • 老实说,我不明白这是如何回答主要问题的。标题中的问题和 OP 在帖子中的第一个问题是:何时/为什么我要明确删除我的构造函数? (2认同)

Al *_*ndy 9

为什么显式删除构造函数?

另一个原因:
delete想确保使用初始化程序调用类时使用。我认为这是无需运行时检查即可实现的非常优雅的方法。

C ++编译器会为您执行此检查。

class Foo
{
   public:
       Foo() = delete;
       Foo(int bar) : m_bar(bar) {};
   private:
       int m_bar;
}
Run Code Online (Sandbox Code Playgroud)

这是非常简化的代码,确保没有这样的实例化:Foo foo;

  • 此处不需要删除的声明。它会通过任何用户提供的构造函数自动删除 (7认同)
  • 为了澄清@MikeLui的注释,已删除的声明*对于编译器*是不必要的。在很多情况下,应包含此类代码以向其他程序员*声明意图。 (4认同)
  • 除了声明您的意图之外,它还创建了一个明显的位置来记录您在公共界面中删除其删除的原因,此外,编译器错误将是诸如“使用已删除函数”之类的简短内容。如果 `Foo` 有许多构造函数,但不是默认构造函数,那么 `Foo foo;` 将导致一个更长的错误,列出它无法匹配的所有隐式定义的、受保护的和私有的构造函数。 (4认同)