我知道制作这样的构造函数:
foo()=delete;
会让它变得不可行,但是呢:
foo()=default;
? 有时候看到这个,不知道是什么意思!
这default
是有用的方法。回想一下,为了成为 POD(“普通旧数据”),类类型必须有一个简单的默认构造函数:
struct this_is_pod
{
int a;
double b;
};
struct this_is_not_pod
{
char c;
float d;
this_is_not_pod() { }
};
但是,如果我们想提供一种以某种非平凡方式初始化类成员的方法呢?仅仅编写一个非默认构造函数是行不通的:
struct foo
{
int m;
void * p;
foo(double q, Bar & o) : m(magic(q), p(o.gizmo(m, q)) { }
};
现在foo
不是POD,因为它完全没有默认构造函数。添加我们自己的默认构造函数,例如foo() {}
,仍然不起作用,因为现在默认构造函数不是微不足道的。C++11 来拯救default
:
struct foo
{
int m;
void * p;
foo(double q, Bar & o) : m(magic(q), p(o.gizmo(m, q)) { }
foo() = default; // trivial!
};
static_assert(std::is_pod<foo>::value, "You will never see this message.");
在 C++03 中,如果你没有定义任何构造函数,编译器会为你生成一个默认构造函数。但是,如果您确实定义了一些其他构造函数,则编译器不会(根本)生成默认构造函数。
告诉编译器=default
生成一个默认构造函数,即使您也明确定义了一些其他构造函数。这是在 C++11 中添加的——在 C++03(或 98)中无法做到这一点。您显式定义的任何构造函数都至少与编译器默认生成的构造函数有所不同。
编译器将隐式生成默认构造函数,除非您自己显式定义任何构造函数。
foo() = default;
即使您定义了非默认构造函数,它也只是指示编译器生成默认构造函数。它与(但请参阅Kerrek SB 的答案)大致相同。foo() {}
它告诉编译器猜测一个默认构造函数,即没有参数的构造函数。如果没有给出“删除”,编译器通常会这样做。它是在 C++11 和 delete 选项中引入的。