为什么一个类可以在成员函数定义中使用,但在用作成员时被视为不完整?

bin*_*bin 5 c++ types

class A
{
     private:
        A a;
};
Run Code Online (Sandbox Code Playgroud)

为什么班上的A是不完整的类型?

class A
{
     public:
          A& operator= (A a){return *this;}
};
Run Code Online (Sandbox Code Playgroud)

是不是该参数Aoperator=一个不完整的类型?为什么上面的代码编译?

Lig*_*ica 4

A因为在类定义中的开放空间中使用与在成员函数定义的参数列表中使用它之间存在差异。这是两个不同的范围。

[C++11: 9.2/2]:在类说明符}结束时,类被视为完全定义的对象类型 (3.9)(或完整类型)。在类成员规范中,该类在函数体、默认参数、异常规范和非静态数据成员的大括号或等于初始化器(包括嵌套类中的此类内容)中被视为完整。否则,它在其自己的类成员规范中被视为不完整

然后是以下特殊情况:

[C++11: 8.3.5/9]:不应在返回类型或参数类型中定义类型。函数定义的参数类型或返回类型不应是不完整的类类型(可能是 cv 限定的),除非函数定义嵌套在该类的成员规范中(包括该类中定义的嵌套类中的定义) )。

“就是那样子。”

实际上,显然不可能A在 an 中存储 an A(因为这需要无限封装),而在成员函数的参数列表中显然不是这种情况。因此,标准委员会有机会让我们变得更容易,他们抓住了这个机会。

此外,如果您尝试a在函数的定义内部使用成员,那么这也是允许的(根据上面的第一个引用),就好像该函数是在类定义结束后按词法声明的一样。