为什么要显式删除构造函数,而不是将其设置为私有的?

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

class Foo
{
public:
Foo() = delete;
};
85752 次浏览

这个怎么样:

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

样本 给你

我遇到过 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.

C + + 编译器会为你做这个检查。

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

This-非常简单-code 保证不存在这样的实例化: Foo foo;