何时/为什么我要显式删除我的构造函数?假设原因是为了防止其使用,为什么不将其设为private
?
class Foo
{
public:
Foo() = delete;
};
谢谢!
答案 0 :(得分:76)
怎么样:
//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
构造函数是合法的。这不适用于已删除的构造函数。
示例here。
答案 1 :(得分:4)
为什么要明确删除构造函数?
另一个原因:
当我要确保使用初始化程序调用类时,我使用delete
。
我认为这是无需运行时检查即可实现的非常优雅的方法。
C ++编译器会为您执行此检查。
class Foo
{
public:
Foo() = delete;
Foo(int bar) : m_bar(bar) {};
private:
int m_bar;
}
此-非常简化-代码确保没有这样的实例:Foo foo;
答案 2 :(得分:1)
我在LLVM的源代码中遇到了声明为'deleted'的默认ctors(例如在AlignOf.h中)。关联的类模板通常位于名为“llvm :: detail”的特殊名称空间中。我认为他的整个目的是他们认为这个班只是一个帮助班。他们从未打算实例化他们;只能在其他类模板的上下文中使用它们,并在编译时运行一些元编程技巧。
EG。这是AlignmentCalcImpl类模板,它只在另一个名为AlignOf的类模板中用作sizeof(。)运算符的参数。该表达式可以在编译时进行评估;并且无需实例化模板 - >那么为什么不宣布默认的ctor删除来表达这个意图。
但这只是我的假设。