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