2015-11-07 138 views
6

是否有一个缺省用户定义构造默认(用户定义的)构造函数和构造函数与默认参数之间的区别?

class Simple 
{ 
public: 
    Simple() {} 
}; 

和用户定义的构造函数的多个参数,但具有默认值对于每个这些

class WithDefaults 
{ 
public: 
    WithDefaults(int i = 1) {} 
}; 

其他的比WithDefaults也可以之间的任何差异用i的明确值构建?

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

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

+0

我期待这是一个重复,实际上,但我无法找到任何答案。 – MicroVirus

+0

它几乎*在[用C++构造函数的默认参数]回答(http://stackoverflow.com/questions/187640/default-parameters-with-c-constructors),我想,但我不确定。 – MicroVirus

+1

我认为,这些课程是相同的。考虑到转换时,他们的行为可能会有所不同。 @MicorVirus的第二条评论中的链接进一步解释了这一点。 –

回答

6

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

一个默认构造了一类X是类X 的构造函数,要么没有参数,否则这不是一个 每个参数函数参数包有一个默认参数。 [...]

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


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

一个默认构造了一类XX类 的构造函数,可以不带参数调用。

由于DR 1630,为了阐明默认初始化的语义,对当前的措词进行了更改。以前,标准中有些地方提到“默认构造函数”,这意味着只能有一个;目前的措辞旨在支持更复杂的场景,您可能会有几个这样的构造函数(例如使用SFINAE),并且使用正常的重载解析来选择使用的场景。

+0

尽管*有* ABI兼容性考虑的一个小差异。 – Deduplicator

+1

@Deduplicator一个很好的观点,但我认为它属于一般性陈述“对于所有参数都有默认参数的函数可以用与没有任何参数的语法相同的语法来调用,但这并不意味着这两个参数函数具有相同的签名“。 – bogdan