默认构造函数不一定没有参数;它们只需要可以使用零个参数来调用即可。
任何所有参数都有默认值的构造函数都满足此条件。
[class.dtor/1]:
类 X 的默认构造函数是类 X 的构造函数,其中每个非函数参数包参数都具有默认参数(包括没有参数的构造函数的情况)。[...]
struct Foo
{
Foo(int a = 0);
Foo(std::string str = "");
};
当然,在这个例子中,你不能使用它们中的任何一个来实例化Foo
而不提供参数(调用将会是含糊的)。但是Foo
仍然可用,并且这些仍然是“默认构造函数”。这只是标准为了定义规则而决定对事物进行分类的方式。它并不会真正影响你的代码或编程。
(顺便说一句,我不想分散注意力,但你应该在这两个上都加上explicit
!)
这是一个具有两个默认构造函数的类的示例,可以进行默认构造:
struct Foo
{
Foo(); // #1
template <class... Args>
Foo(Args...); // #2
};
auto test()
{
Foo f{}; // ok calls #1
}