2

GCC G++ 9

这段代码:

   class foo {
     int bar[] = {111, 123};
   };

产生关于灵活数组的初始化程序的错误。但是这个:

   class foo {
     int bar[2] = {111, 123};
   };

正常编译。不计算我输入的值的任何解决方法?

4

1 回答 1

4

与您可以执行的功能不同

int foo[] = { 1, 2, 3 };

foo当你这样做时,编译器将从初始化程序中推断出大小

struct bar
{
    int foo[] = { 1, 2, 3 };
};

你真正拥有的是

struct bar
{
    bar() : foo{ 1, 2, 3 } {}
    int foo[];
};

这是行不通的,因为 C++ 不允许像 C 那样的灵活数组。

这让你有两个选择。首先是您指定大小。这不是最好的解决方案,因为它可能会引入错误,但它会让您免于动态初始化。第二个选项是使用在运行时可以从列表中初始化的类型。例如, Astd::vector可以很好地满足该要求。是的,会有动态内存分配,但由于std::vectorRAII类型,你不必担心它,可以使用默认的构造函数和析构函数。

于 2020-01-08T21:55:10.887 回答