什么时候/为什么要显式删除我的构造函数?假设原因是为了防止使用它,为什么不仅仅使用它private
呢?
class Foo
{
public:
Foo() = delete;
};
什么时候/为什么要显式删除我的构造函数?假设原因是为了防止使用它,为什么不仅仅使用它private
呢?
class Foo
{
public:
Foo() = delete;
};
delete
。问题和陆谦的回答都容易被认为是建设性的。任何没有呼吸C ++ 11优点的人都需要尽快从这两者中受益。
Answers:
怎么样:
//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;
Foo
有许多构造函数,而不仅仅是默认构造函数,那么Foo foo;
将导致更长的错误列出所有与之不匹配的隐式定义,受保护和私有构造函数。
我遇到了在LLVM的源代码中声明为“已删除”的默认ctor(例如,在AlignOf.h中)。关联的类模板通常位于称为“ llvm :: detail”的特殊命名空间中。我认为这里的全部目的是他们只将该课程视为帮助者课程。他们从来没有打算实例化它们。只能在具有编译时运行的一些元编程技巧的其他类模板的上下文中使用它们。
例如。这里有这个AlignmentCalcImpl类模板,该类模板仅在另一个名为AlignOf的类模板中用作sizeof(。)运算符的参数。该表达式可以在编译时求值;并且不需要实例化模板->那么为什么不声明默认的ctor delete来表达这种意图。
但这只是我的假设。
= default
,即使是类也不能使用它,我个人更喜欢看到使用Deleted函数。在函数是私有的。前者明确指出“这并不意味着要使用”。如果从中得出任何结果,则该类无法使用它实际上在语义上有所不同。