2017-03-06 133 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 
};