为什么允许这样做:
// 1
struct S {
std::vector<S> v;
};
// 2
struct T {
T* ptr;
};
这不是:
// 3
struct X {
X arr[];
};
这是第三个示例(clang-1001.0.46.3
编译器)的错误:
sample.cpp:9:4: error: field has incomplete type 'X'
X arr[];
^
sample.cpp:8:8: note: definition of 'X' is not complete until the closing '}'
struct X {
^
我了解结构中不允许使用固定大小的数组的原因,这是因为sizeof(T) = sizeof(T)*array_size + size_of_other_members
,尽管可以用std::vector<T>
进行编译,但是不能使用T[]
进行编译。
答案 0 :(得分:3)
要定义一个变量,编译器需要知道该变量的大小。
在第一种情况下,您拥有的是指向S
的指针(请记住std::vector
是动态分配堆的内存,因此只需要一个指针),这是可以的,因为编译器知道大小指针。
在第二种情况下,当您使用X
时,类型(结构)尚未完全定义,因此编译器尚不知道X
的大小。此外,在C ++中,不能有“空”数组,所有数组必须具有编译时固定大小。
答案 1 :(得分:0)
它被称为Flexible array member
,是在C编程语言的c99
标准中引入的。
因此,在C
中可以进行以下操作,
struct IntContainer
{
size_t length;
int arr[];
};
但是C++
没有灵活的数组成员。
有关更多信息,请参见以下Flexible array member - wikipedia