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

Difference between default (user-defined) constructor and constructor with default arguments?

默认的用户自定义构造函数有什么区别

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

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

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

除此之外 WithDefaults 也可以用显式值构造 i?

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

换句话说,所有参数都具有默认值的构造函数是否在所有方面都是默认构造函数?

当前标准工作草案 N4527 [12.1p4]:

A default constructor for a class X is a constructor of class X that either has no parameters or else each parameter that is not a function parameter pack has a default argument. [...]

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


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

A default constructor for a class X is a constructor of class X that can be called without an argument.

由于 DR 1630 对当前措辞进行了更改,以阐明默认初始化的语义。以前,标准中有地方提到“the默认构造函数”,暗示只能有一个;当前的措辞旨在支持更复杂的场景,您可能有多个这样的构造函数(例如使用 SFINAE),并且使用的是使用正常重载决策选择的构造函数。