C++ 递归类型定义

Beg*_*ner 5 c++

为什么下面的代码有效?struct test 包含一个 test 向量,以便编译以下代码(IDEOne)

#include <iostream>
#include <vector>

using namespace std;

struct test {
    vector<test> a;
};

int main() {
    // your code goes here
    test t;
    if (t.a.size() > 0)
        return -1;
    else if (t.a[0].a[0].a.size() > 0)
        return 1;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

编译器如何处理结构以便可以测试t.a[0].a[0].a.size()?我可以重复的频率有限制.a[0]吗?


编辑:这个问题的答案声称这是未定义的行为:C++ 递归类型定义是否可能,特别是我可以在 T 的定义中放置一个 vector<T> 吗?

=> 这令人困惑

=> 也许我的问题是重复的

das*_*ght 3

这归结为vector<T>不需要知道类型值占用的大小T,这允许T是不完整的类型。本质上,这里的机制与此声明中的相同:

struct test {
    test* start;
    test* end;
};
Run Code Online (Sandbox Code Playgroud)

编译器在声明任何类型的指针时都没有问题,只要您承诺稍后定义它即可。

此行为根据模板而变化:使用testa定义没有问题vector<T>,但 anarray<T,Size>甚至 apair<T,K>都会有问题:

struct broken1 {
    array<broken1,3> a; // Does not compile
};
struct broken2 {
    pair<broken2,broken2> p; // Does not compile
};
Run Code Online (Sandbox Code Playgroud)