多个默认构造函数

Multiple Default Constructors

来自 的答案包含这句话:

... definition says that all default constructors (in case there are multiple) ...

怎么会有多个默认构造函数,为什么它有用或被标准允许?

默认构造函数不必没有参数;他们只需要在没有参数的情况下被调用。

任何参数都具有默认值的构造函数都满足此条件。

[class.dtor/1]: A default constructor for a class X is a constructor of class X for which each parameter that is not a function parameter pack has a default argument (including the case of a constructor with no parameters). [..]

struct Foo
{
   Foo(int a = 0);
   Foo(std::string str = "");
};

现在,当然,在此示例中,您实际上无法在不提供参数的情况下使用其中任何一个实例化 Foo(调用会产生歧义)。但是Foo还是可以用的,这些还是"default constructors"。这就是标准为了定义规则而决定对事物进行分类的方式。它不会真正影响您的代码或编程。

(顺便说一句,我不想​​分散你的注意力,但你应该 explicit 这两个!)

下面是一个 class 的例子,它有两个可以默认构造的默认构造函数:

struct Foo
{
    Foo(); // #1

    template <class... Args>
    Foo(Args...); // #2
};

auto test()
{
    Foo f{}; // ok calls #1
}