C++ 关于C++;具有自引用的类

C++ 关于C++;具有自引用的类,c++,class,exception,C++,Class,Exception,我有点困惑 为什么在C++中允许这样做: static int t = 0; class A { public: A() : m(t++) { cout << "C:" << m << endl; if(t >= 5) { A a; // <<<&

我有点困惑

为什么在C++中允许这样做:

static int t = 0;

class A
{
    public:
        A() : m(t++)
        {

            cout << "C:" << m << endl; 
            if(t >= 5)
            {
                A a;                      // <<<< ----- THIS line
                throw( a);
            }
        }            

        int m;
};
static int t=0;
甲级
{
公众:
A():m(t++)
{

cout当您声明任何变量时,编译器应该知道该变量的大小。在第二个示例中,您在
A
内部创建
A
对象,因此编译器将无法计算
A
的大小以分配内存

也可以指向一些C++的标准条目来解释这种情况?

是的,说明类在结束时才完全定义,这在第9.2节第2段:

在类说明符的结尾}处,类被视为完全定义的对象类型(3.9)(或完全类型)。[……]

并且类的所有非静态数据成员必须完整,从第9段:

非静态(9.4)数据成员的类型不得不完整。特别是,C类不应包含C类的非静态成员,但它可以包含指向C类对象的指针或引用

但在第2段中,在建造商内部也被认为是完整的:

[…]在类成员规范中,类在函数体、默认参数[…]中被视为是完整的

尽管静态成员可能不完整,但第9.4.2节静态数据成员第2段:

静态数据成员在其类定义中的声明不是定义,可能是除cv限定void之外的不完整类型。[…]


不允许类包含自身也是有意义的,因为这需要无限的空间,因为自引用永远不会结束,
a
包含
a
,其中包含
a

除了类型不完整之外,
A
的大小将是无限的,如果允许该成员,构造将永远不会返回。是的!关于课程的“完整性”,这正是我想要的:)谢谢!
static int t = 0;

class A
{
    public:

        A() : m(t++)
        {

            cout << "C:" << m << endl; 
        }

        A a;                            // <<<< ----- THIS line

        int m;
};