为什么显式删除构造函数?
何时/为什么我要显式删除我的构造函数? 假设原因是为了防止它的使用,为什么不把它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这个意图。
但这只是我的假设。