被隐式删除默认构造函数与编译器不合成默认构造函数相同

Is implicitly deleted default constructor same as Compiler not synthesizing the default constructor

我正在学习 C++ 中的 class。我开始知道在 certain situations 中可以隐式删除默认构造函数。另外,我读到当我们有一个用户定义的构造函数时,编译器将不会自动合成默认构造函数。

以我目前的理解,隐式删除默认构造函数与默认构造函数未自动合成的情况有很大不同。我的意思是在这两种情况下我们都有相同的效果,那就是我们不能使用默认初始化来创建对象。但是隐式删除的默认构造函数仍然与编译器不合成默认构造函数不同。

但后来我遇到了 的回答,上面写着:

when you explicitly declare any constructors, the default constructor is implicitly deleted.

(引用结束)

正如我所说,我认为当我们在 class 中有用户定义的构造函数时,默认构造函数不会被隐式删除。相反,默认构造函数不会由编译器自动合成,这与隐式删除不同(IMO)。所以引用的答案在我看来在技术上是错误的。因此,引用的答案应该改为说,当我们有用户定义的构造函数时,编译器不会自动为我们合成默认的构造函数。但是很多人都赞成(+标记为正确)这个答案,所以我可能遗漏了一些东西。请纠正我对主题的理解错误,并告诉我引用的答案在技术上是否正确。

我的观点是“隐式删除默认构造函数”和“编译器由于存在用户定义的构造函数而未合成默认构造函数”是两回事。

这在 [class.default.ctor]:

中有介绍

If there is no user-declared constructor for class X, a non-explicit constructor having no parameters is implicitly declared as defaulted ([dcl.fct.def])

因此,如果有 user-declared 个构造函数,则不会创建“隐式声明”的默认构造函数。

更广泛的问题是:为什么不删除隐式声明的默认构造函数而不是根本不添加?

嗯,这里是默认构造函数的定义:

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).

基本上,如果可以不带参数调用构造函数,那么它就是默认构造函数。所以它不是由单个签名定义的;它是通过调用行为来定义的。

但是默认构造函数声明也是 user-declared 构造函数的声明。因此,如果您声明一个默认构造函数,编译器将不会隐式声明它自己的构造函数。因为否则你会有 两个默认构造函数 ,这是...无用的,因为根据定义,它们都可以在没有参数的情况下调用(因此没有什么可以重载),其中之一是已删除.

所以是的,如果您提供 user-declared 构造函数,说它被删除是不正确的。