我对以下陈述感到困惑。
从规范:
在隐式定义一个类的隐式声明的默认构造函数之前,其基类及其非静态数据成员的所有隐式声明的默认构造函数都应已隐式定义。
我的理解是:
隐式声明的默认构造函数是在创建对象时隐式定义的。
上面的说法是什么意思?如果基类包含显式默认构造函数,那么派生类不能有隐式默认构造函数吗?请澄清,如果有人提供一段示例代码可能会很好。
该语句意味着当编译器必须为隐式声明的默认构造函数提供定义时(即当这种构造函数是odr-used时),在定义当前构造函数之前,编译器必须确保所有成员都可以默认构造,并且为此它可能需要隐式定义成员的任何隐式声明的默认构造函数。
例如:
struct A { int x; };
struct B { A a; }; // [1]
int main() {
B b; // [2]
}
b
[2] 中变量的定义是隐式声明的构造函数 for的odr-useB
,但在编译器隐式定义 之前B::B()
,因为它有A
[1] 中声明的类型的成员,所以需要隐式定义A::A()
。原因是它B::B()
会在它的初始化列表中使用 odr 。 A::A()
假设您有类Base
和Derived
(从基派生)。
让我们假设它们都隐式声明了默认构造函数。当您创建Derived
类对象时,将发生以下情况。首先Base
,将为该类定义隐式声明的默认构造函数。之后,类的隐式声明的构造函数也会发生同样的情况Derived
。
这完全有道理,因为当您创建类的对象时,首先调用Derived
该类的构造函数Base
。如果到那时还没有定义,那么,很可能会发生一些不好的事情。
相同的事情适用于任何具有此类构造函数的类成员:它们是在定义类自己的构造函数之前定义的。