big*_*iao 10 c++ forward-declaration
例:
class A
{
class B
{
A c;//error!A is an incomplete type
void test() { A b;/*OK,but why?*/ }
};
};
Run Code Online (Sandbox Code Playgroud)
代码片段对我来说似乎很奇怪,这两种用法有A什么区别?
Bri*_*ian 14
[class.mem]/6指定:
}在类说明符结束时, 类被视为完全定义的对象类型(6.9)(或完整类型).在类成员规范中,该类在函数体,默认参数,noexcept-specifiers和默认成员初始化器(包括嵌套类中的这类事物)中被视为完整.否则,它在其自己的类成员规范中被视为不完整.
对象的定义(如在A b;or中A c;)要求对象具有完整的类型.正如上面的段落所述,类型在其自己的定义中是不完整的,除了在某些地方:即内部成员函数体和一些其他地方.
此规则使得可以在内联定义的成员函数内编写非平凡代码,同时还禁止类包含自身(直接或间接).