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

C++ 即使使用用户定义的构造函数,编译器何时仍会生成默认构造函数?,c++,c++11,constructor,default-constructor,C++,C++11,Constructor,Default Constructor,在“C++并发操作”一书附录A.3中,当引入默认函数时,它说: 在正常情况下,如果您手动编写任何其他构造函数,编译器将不再为您生成默认构造函数,因此如果您想要一个,您必须编写它,这意味着您将丢失这个奇怪的初始化属性。然而, 通过显式地将构造函数声明为默认构造函数,您可以强制编译器为您生成默认构造函数,并且保留此属性 这是否意味着在某些情况下(除了显式添加=default),即使使用用户定义的构造函数,编译器仍然会生成默认构造函数?如果是,这些情况是什么?或者只是我在这里过于挑剔了。这是C++11

在“C++并发操作”一书附录A.3中,当引入默认函数时,它说:

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


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

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

如果类
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");
#包括
结构A{};
结构B{B(B&&)=删除;};
静态断言(std::is_default_constructible::value,“A”);
静态断言(!std::is_default_constructible::value,“B”);

不,它只是表示它所说的意思,即
=default
表示它的意思。