为什么嵌套类的成员函数不需要完整的类型?

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;)要求对象具有完整的类型.正如上面的段落所述,类型在其自己的定义中是不完整的,除了在某些地方:即内部成员函数体和一些其他地方.

此规则使得可以在内联定义的成员函数内编写非平凡代码,同时还禁止类包含自身(直接或间接).