2017-03-06 202 views
4

为什么下面的代码有效?该结构包含测试测试向量,所以下面的代码compiles (IDEOne)C++递归类型定义

#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; 
} 

编译器如何处理结构,这样是可以测试t.a[0].a[0].a.size()?有多少次我可以重复.a[0]


编辑:此问题已声称这是不确定的行为答案:Are C++ recursive type definitions possible, in particular can I put a vector<T> within the definition of T?

=>这是令人困惑

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

+1

对'的std :: VECTOR'默认构造函数不要求模板参数是完全限定的名称。 – paddy

+1

为了将事物推得更远,'struct WTF:std :: vector {};'我用它来构建[Peano的自然数](https://en.wikipedia.org/wiki/Peano_axioms):D – YSC

+0

(提示: 'operator ++()'只是'{push_back(* this); return * this;}') – YSC

回答

2

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

struct test { 
    test* start; 
    test* end; 
}; 

编译器有没有问题,声明函数指针的任何类型的,只要你答应在稍后的某个点来定义它。

基于模板的这种行为变化:你有一个vector<T>定义test没有问题,而是一个array<T,Size>甚至pair<T,K>会产生问题:

struct broken1 { 
    array<broken1,3> a; // Does not compile 
}; 
struct broken2 { 
    pair<broken2,broken2> p; // Does not compile 
};