为什么下面的代码有效?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> 吗?
=> 这令人困惑
=> 也许我的问题是重复的
这归结为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)