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
为什么默认构造函数的位置很重要:在类内部还是外部?
请注意,如果您实际尝试实例化B,那么您还会收到已删除的错误B::B(): https: //gcc.godbolt.org/z/jdKzv7zvd
造成差异的原因可能是,当您声明C构造函数时,用户C(假设定义位于另一个翻译单元中)无法知道构造函数实际上已被删除。最好的情况下,这会导致一些令人困惑的链接器错误,最坏的情况下,它只会在运行时崩溃。B在所有用户的情况下,B将立即能够知道默认构造函数已被删除,因此将其声明为默认构造函数不会造成任何损害(即使它像 clang 警告的那样没有意义)。