默认(用户定义的)构造函数和默认参数的构造函数之间的区别?

时间:2015-11-07 21:04:46

标签: c++ constructor language-lawyer default-constructor

默认的用户定义构造函数

之间是否有任何区别
class Simple
{
public:
    Simple() {}
};

和一个用户定义的构造函数,它接受多个参数,但每个参数都有默认值

class WithDefaults
{
public:
    WithDefaults(int i = 1) {}
};
除了WithDefaults以外,

还可以使用i的显式值构建吗?

具体来说,我想知道,就语言而言,这两个构造函数是否为两者构建完全相同的默认构造函数,或者类的属性之间是否存在细微差别?

换句话说,是一个构造函数,它的所有参数的默认值都是默认的构造函数吗?

1 个答案:

答案 0 :(得分:6)

现行标准工作草案N4527 [12.1p4]:

  

X默认构造函数是类X的构造函数   要么没有参数,要么每个参数都不是a   function parameter pack有一个默认参数。 [...]

所以是的,第二个类的构造函数是一个完全有效的默认构造函数。

请注意,C ++ 11和14的已发布版本中的措辞略有不同,但对您的问题没有任何影响。它曾经是:

  

X默认构造函数是类X的构造函数   可以不带参数调用。

当前措辞的更改是DR 1630的结果,以便阐明默认初始化的语义。以前,标准中有些地方提到“ 默认构造函数”,暗示只能有一个;当前的措辞旨在支持更复杂的场景,在这些场景中你可能有几个这样的构造函数(例如使用SFINAE),并且使用的是使用正常的重载分辨率。