默认的用户定义构造函数
之间是否有任何区别class Simple
{
public:
Simple() {}
};
和一个用户定义的构造函数,它接受多个参数,但每个参数都有默认值
class WithDefaults
{
public:
WithDefaults(int i = 1) {}
};
除了WithDefaults
以外,还可以使用i
的显式值构建吗?
具体来说,我想知道,就语言而言,这两个构造函数是否为两者构建完全相同的默认构造函数,或者类的属性之间是否存在细微差别?
换句话说,是一个构造函数,它的所有参数的默认值都是默认的构造函数吗?
答案 0 :(得分:6)
现行标准工作草案N4527 [12.1p4]:
类
X
的默认构造函数是类X
的构造函数 要么没有参数,要么每个参数都不是a function parameter pack有一个默认参数。 [...]
所以是的,第二个类的构造函数是一个完全有效的默认构造函数。
请注意,C ++ 11和14的已发布版本中的措辞略有不同,但对您的问题没有任何影响。它曾经是:
类
X
的默认构造函数是类X
的构造函数 可以不带参数调用。
当前措辞的更改是DR 1630的结果,以便阐明默认初始化的语义。以前,标准中有些地方提到“ 默认构造函数”,暗示只能有一个;当前的措辞旨在支持更复杂的场景,在这些场景中你可能有几个这样的构造函数(例如使用SFINAE),并且使用的是使用正常的重载分辨率。