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

时间:2012-12-01 00:01:35

标签: c++

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

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

谢谢!

3 个答案:

答案 0 :(得分:76)

怎么样:

//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构造函数是合法的。这不适用于已删除的构造函数。

示例here

答案 1 :(得分:4)

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

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

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

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

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

答案 2 :(得分:1)

我在LLVM的源代码中遇到了声明为'deleted'的默认ctors(例如在AlignOf.h中)。关联的类模板通常位于名为“llvm :: detail”的特殊名称空间中。我认为他的整个目的是他们认为这个班只是一个帮助班。他们从未打算实例化他们;只能在其他类模板的上下文中使用它们,并在编译时运行一些元编程技巧。

EG。这是AlignmentCalcImpl类模板,它只在另一个名为AlignOf的类模板中用作sizeof(。)运算符的参数。该表达式可以在编译时进行评估;并且无需实例化模板 - >那么为什么不宣布默认的ctor删除来表达这个意图。

但这只是我的假设。

相关问题