即使使用用户定义的构造函数,编译器何时仍会生成默认构造函数?

her*_*tao 4 c++ constructor default-constructor c++11

在《C++ Concurrency in Action》附录 A.3 中,在介绍默认函数时,它说:

一般情况下,如果你手动编写任何其他构造函数,编译器将不再为你生成默认构造函数,所以如果你想要一个你必须编写它,这意味着你失去了这个奇怪的初始化属性。但是,通过显式声明构造函数为默认构造函数,您可以强制编译器为您生成默认构造函数,并且保留此属性。

这是否意味着在某些情况下(=default显式添加除外),即使使用用户定义的构造函数,编译器仍会生成默认构造函数?如果是,这些情况是什么?或者只是我在这里挑剔的话。

Ker*_* SB 5

这是由 C++11 12.1/5 回答的:

如果 class 没有用户声明的构造X函数,则没有参数的构造函数被隐式声明为默认值。

因此,只要您声明了任何其他构造函数(即使是默认的或已删除的),就没有隐式声明的默认构造函数。

例子:

#include <type_traits>

struct A { };

struct B { B(B &&) = delete; };

static_assert(std::is_default_constructible<A>::value, "A");
static_assert(!std::is_default_constructible<B>::value, "B");
Run Code Online (Sandbox Code Playgroud)