将T的数组存储在结构T中时,类型错误

时间:2019-07-13 07:47:01

标签: c++ arrays vector

为什么允许这样做:

// 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[]进行编译。

2 个答案:

答案 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