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

Why does a defaulted default constructor depend on whether it is declared inside or outside of class?

在下面的例子中,struct A没有默认构造函数。所以从它继承的struct Bstruct C都不能得到编译器生成的默认构造函数:

struct A {
    A(int) {}
};

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

struct C : A {
    C();
};

C::C() = default; //#2

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

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

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

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

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