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

时间:2014-04-30 08:26:35

标签: c++ c++11 constructor default-constructor

在书中" C ++并发行动"附录A.3,在引入违约函数时,它说:

  

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

是否仍然存在某些情况(除了明确添加=default之外)编译器仍然会生成默认构造函数,即使用户定义的构造函数也是如此?如果是,这些情况是什么?或者只是我对这里的文字进行挑剔。

1 个答案:

答案 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");
相关问题