为什么默认的默认构造函数取决于它是在 class 内部还是外部声明的?
Why does a defaulted default constructor depend on whether it is declared inside or outside of class?
在下面的例子中,struct A
没有默认构造函数。所以从它继承的struct B
和struct 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 警告的那样没有意义)默认。
在下面的例子中,struct A
没有默认构造函数。所以从它继承的struct B
和struct 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 警告的那样没有意义)默认。