C++ &引用;什么时候;编译器是否隐式声明默认构造函数?

C++ &引用;什么时候;编译器是否隐式声明默认构造函数?,c++,visual-studio-2010,constructor,C++,Visual Studio 2010,Constructor,我知道,如果我们不声明,编译器将生成一个默认构造函数 “什么时候”是我困惑的重点 A: B: A和B的区别只是B声明了一个Base的真实对象。 在我看来,只有当我们声明一个真实的对象,并且编译器没有发现构造函数时,它才会生成一个默认的构造函数 我的问题是: 代码片段A是否会生成基的默认构造函数 是否有任何工具有助于检查结果?我使用VisualStudio2010,并且/d1 reportAllClassLayout似乎没有用 引用C++11 [class.ctor]§5: 类X的默认构造函数是类

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

“什么时候”是我困惑的重点

A:

B:

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

我的问题是:

  • 代码片段A是否会生成基的默认构造函数

  • 是否有任何工具有助于检查结果?我使用VisualStudio2010,并且/d1 reportAllClassLayout似乎没有用

  • 引用C++11

    [class.ctor]§5

    X
    的默认构造函数是类
    X
    的构造函数,无需参数即可调用。如果类
    X
    没有用户声明的构造函数,则没有参数的构造函数将隐式声明为默认构造函数(8.4)

    [class.ctor]§6

    当odr使用(3.2)创建其类类型(1.8)的对象时,或者当它在第一次声明后显式默认时,默认且未定义为已删除的默认构造函数将被隐式定义

    这意味着它在定义类时声明,在给定的翻译单元中首次使用时定义(作为
    inline

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

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


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

    您指的是标准所说的,还是您的实现所做的?实现的最终结果符合标准的要求,但实现结果的方式可能会有微妙的不同duplicate@hvd实际上,我想知道编译器对我的实现做了什么。Angew给出了一个非常清晰的解释,我仍然想知道是否有任何方法可以让我们理解编译器真正做什么?@MikeHung实现真正做什么更复杂。举个简单的例子,如果构造函数从未被调用过(甚至从其他翻译单元调用过——可能是因为其他翻译单元无法使用它),并且编译器知道这一点,那么它就不需要定义构造函数。(注意:您的代码中没有调用构造函数,因为您的类是POD类型。)应该清楚的是,不定义从未调用过的函数不会影响程序的行为,但它可能会影响显示构造函数是否已定义的任何工具的输出。@ST3我无法对您的答案进行评论,因为它已被删除,但我不想不回答您的问题:“为什么更喜欢默认生成的副本?”没有特定顺序:维护。生成的默认值将始终处理所有数据成员,即使您稍后添加了一些。移动。通过不提供copy-ctor/assignment-op,您可以让编译器同时生成这些和move-ctor/assignment-op(如果它比VC更符合要求的话)。表演。没有用户提供的复制因子/分配操作的类可以很容易地复制,一些算法可以用于优化。非常感谢,这对我很有帮助!
    class Base {};
    int main()
    {
        return 0;   
    }
    
    class Base {};
    int main()
    {
        Base b;   // Declare a Base object.
        return 0;
    }