多个默认构造函数
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
}
来自
... 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
}