“何时”编译器是否隐式声明了默认构造函数?

时间:2013-10-13 16:52:27

标签: c++ visual-studio-2010 constructor

我知道如果我们不声明它,编译器将生成一个默认构造函数。

而“何时”是我感到困惑的一点。

A:

class Base {};
int main()
{
    return 0;   
}

B:

class Base {};
int main()
{
    Base b;   // Declare a Base object.
    return 0;
}

A和B的区别仅在于B声明了Base的真实对象。 在我看来,只有当我们声明一个真实对象并且编译器找不到构造函数时,它才会生成一个默认构造函数。

我的问题是:

  1. 代码片段A会生成Base的默认构造函数吗?

  2. 是否有任何工具可以帮助检查结果?我使用Visual Studio 2010,而/ d1 reportAllClassLayout似乎没用。

2 个答案:

答案 0 :(得分:6)

引用C ++ 11。

[class.ctor]§5

  

X的默认构造函数是类X的构造函数,可以在没有参数的情况下调用它。如果类X没有用户声明的构造函数,则没有参数的构造函数被隐式声明为默认值(8.4)。

[class.ctor]§6

  

默认构造函数是默认的,未定义为已删除的隐式定义,当使用odr-used(3.2)创建其类类型的对象(1.8)或明确默认时在第一次宣布之后。

这意味着它在您的类被定义时被声明,并且在它首次在给定的翻译单元中使用时被定义(如inline)。

在您的情况下,这意味着代码片段A将包含默认构造函数的声明(但不是定义),而片段B将包含两者。

答案 1 :(得分:3)

特殊成员函数(默认构造函数,复制构造函数等)的声明总是作为类定义的一部分发生。因此,对于具有声明的默认构造函数的Base,您的两个示例都是相同的。

另一个问题是特殊成员函数是否隐式定义。这通常推迟到成员函数的实际ODR使用之前。