112

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

class Foo
{ 
  public: 
    Foo() = delete; 
};
4

3 回答 3

105

怎么样:

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

void Foo::foo()
{
   Foo f;    //illegal
}

相对

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

void Foo::foo()
{
   Foo f;    //legal
}

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

样品在这里

于 2012-12-01T00:06:57.557 回答
16

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

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

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

class Foo
{
   public:
       Foo() = delete;
       Foo(int bar) : m_bar(bar) {};
   private:
       int m_bar;
}

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

于 2018-06-19T20:32:33.303 回答
2

我遇到了在 LLVM 的源代码中声明为“已删除”的默认 ctors(例如在 AlignOf.h 中)。相关的类模板通常位于一个名为“llvm::detail”的特殊命名空间中。我认为那里的全部目的是他们认为该课程仅作为助手课程。他们从未打算实例化它们;只是在其他类模板的上下文中使用它们,并带有一些在编译时运行的元编程技巧。

例如。有这个 AlignmentCalcImpl 类模板,它仅在另一个名为 AlignOf 的类模板中用作 sizeof(.) 运算符的参数。该表达式可以在编译时进行评估;并且不需要实例化模板 -> 那么为什么不声明默认的 ctor delete 来表达这个意图。

但这只是我的假设。

于 2016-10-26T08:31:49.160 回答