何时/为什么要显式删除我的构造函数?假设原因是为了防止它的使用,为什么不直接制作呢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
告诉您只有类的成员才能调用该方法或访问该变量(当然还有朋友)。在这种情况下,static
该类(或任何其他成员)的方法调用private
类的构造函数是合法的。这不适用于已删除的构造函数。
样品在这里。
为什么要显式删除构造函数?
另一个原因:当我想确保使用初始化程序调用一个类时,我会
使用它。delete
我认为这是一种非常优雅的方式,无需运行时检查即可实现这一目标。
C++ 编译器会为您执行此检查。
class Foo
{
public:
Foo() = delete;
Foo(int bar) : m_bar(bar) {};
private:
int m_bar;
}
这 -非常简化- 代码确保没有像这样的实例化:Foo foo;
我遇到了在 LLVM 的源代码中声明为“已删除”的默认 ctors(例如在 AlignOf.h 中)。相关的类模板通常位于一个名为“llvm::detail”的特殊命名空间中。我认为那里的全部目的是他们认为该课程仅作为助手课程。他们从未打算实例化它们;只是在其他类模板的上下文中使用它们,并带有一些在编译时运行的元编程技巧。
例如。有这个 AlignmentCalcImpl 类模板,它仅在另一个名为 AlignOf 的类模板中用作 sizeof(.) 运算符的参数。该表达式可以在编译时进行评估;并且不需要实例化模板 -> 那么为什么不声明默认的 ctor delete 来表达这个意图。
但这只是我的假设。