我知道制作这样的构造函数:
foo()=delete;
会让它无法接受,但是:
foo()=default;
?我有时会看到这个,但我不知道这意味着什么!
答案 0 :(得分:8)
以下是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.");
答案 1 :(得分:4)
在C ++ 03中,如果没有定义任何构造函数,编译器会为您生成一个默认构造函数。但是,如果确实定义了其他构造函数,则编译器不会生成默认构造函数(根本没有)。
=default
告诉编译器生成默认构造函数,即使您已经明确定义了一些其他构造函数。这是在C ++ 11中添加的 - 在C ++ 03(或98)中无法做到这一点。您明确定义的任何构造函数与编译器默认生成的内容至少略有不同。
答案 2 :(得分:0)
它告诉编译器猜测一个默认构造函数,指一个没有参数的构造函数。如果没有给出“删除”,这就是编译器通常会做的事情。它是在C ++ 11中引入的以及删除选项。
答案 3 :(得分:0)
编译器将隐式生成默认构造函数,除非您自己明确定义了任何构造函数。
即使您定义了非默认构造函数,foo() = default;
也只是指示编译器生成默认构造函数。它 与foo() {}
相同(但请参阅Kerrek SB's answer)。