为什么默认的默认构造函数取决于它是在类内部还是外部声明?

Fed*_*dor 2 c++ default default-constructor defaulted-functions

在下面的示例中,struct A没有默认构造函数。因此,从它继承的struct B和 都struct C无法获得编译器生成的默认构造函数:

struct A {
    A(int) {}
};

struct B : A {
    B() = default; //#1
};

struct C : A {
    C();
};

C::C() = default; //#2
Run Code Online (Sandbox Code Playgroud)

#1. 在 中struct B,默认的默认构造函数在类内部声明,并且所有编译器都接受它,只有 Clang 显示警告说:explicitly defaulted default constructor is implicitly deleted [-Wdefaulted-function-deleted]

#2. 但是在外部声明的默认构造函数struct C会生成编译器错误。演示: https: //gcc.godbolt.org/z/3EGc4rTqE

为什么默认构造函数的位置很重要:在类内部还是外部?

Ala*_*les 5

请注意,如果您实际尝试实例化B,那么您还会收到已删除的错误B::B(): https: //gcc.godbolt.org/z/jdKzv7zvd

造成差异的原因可能是,当您声明C构造函数时,用户C(假设定义位于另一个翻译单元中)无法知道构造函数实际上已被删除。最好的情况下,这会导致一些令人困惑的链接器错误,最坏的情况下,它只会在运行时崩溃。B在所有用户的情况下,B将立即能够知道默认构造函数已被删除,因此将其声明为默认构造函数不会造成任何损害(即使它像 clang 警告的那样没有意义)。