何时/为什么要显式删除构造函数?假设原因是为了防止它的使用,为什么不干脆使它 private?
private
class Foo { public: Foo() = delete; };
这个怎么样:
//deleted constructor class Foo { public: Foo() = delete; public: static void foo(); }; void Foo::foo() { Foo f; //illegal }
VS
//private constructor class Foo { private: Foo() {} public: static void foo(); }; void Foo::foo() { Foo f; //legal }
它们基本上是不同的东西。private告诉您,只有类的成员可以调用该方法或访问该变量(当然也可以是朋友)。在这种情况下,该类(或任何其他成员)的 static方法调用该类的 private构造函数是合法的。这不适用于已删除的构造函数。
static
样本 给你。
我遇到过 LLVM 源代码中声明为“已删除”的默认 ctor (例如,在 AlignOf.h 中)。相关联的类模板通常位于一个名为‘ llvm: : Details’的特殊命名空间中。我认为这里的整个目的是,他们认为那个类只是一个助手类。它们从未打算实例化它们; 只是在其他类模板的上下文中使用它们,并使用一些在编译时运行的元编程技巧。
例如,有一个 AlignmentCalcImpl 类模板,它只在另一个名为 AlignOf 的类模板中用作 sizeof (.)的参数接线员。这个表达式可以在编译时求值; 而且不需要实例化 template-> ,所以为什么不声明默认的 ctor delete 来表达这个意图。
但这只是我的假设。
why explicitly delete the constructor?
另一个原因是: 当我想确保用初始化程序调用类时,我使用 delete。 I consider it as a very elegant way to achieve this without runtime checks.
delete
C + + 编译器会为你做这个检查。
class Foo { public: Foo() = delete; Foo(int bar) : m_bar(bar) {}; private: int m_bar; }
This-非常简单-code 保证不存在这样的实例化: Foo foo;
Foo foo;