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

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

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

谢谢!

怎么样:

 //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告诉你,只有类的成员可以调用该方法或访问该variables(或当然是朋友)。 在这种情况下,该类(或任何其他成员)的static方法调用类的private构造函数是合法的。 这不适用于已删除的构造函数。

在这里示例。

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

例如。 有这个AlignmentCalcImpl类模板,仅在称为AlignOf的另一个类模板中用作sizeof(。)运算符的参数。 该expression式可以在编译时进行评估; 而且没有必要实例化模板 – >为什么不声明默认的ctor删除来expression这个意图。

但这只是我的假设。