在书中" C ++并发行动"附录A.3,在引入违约函数时,它说:
在正常情况下,如果你手动编写任何其他构造函数,编译器将不再为你生成默认构造函数,所以如果你想要一个你必须编写它,这意味着你失去了它奇怪的初始化属性。然而, 通过显式地将构造函数声明为默认值,您可以强制编译器为您生成默认构造函数,并保留此属性。
是否仍然存在某些情况(除了明确添加=default
之外)编译器仍然会生成默认构造函数,即使用户定义的构造函数也是如此?如果是,这些情况是什么?或者只是我对这里的文字进行挑剔。
答案 0 :(得分:4)
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");