作为 class 成员的灵活数组
Flexible array as a class member
海湾合作委员会 G++ 9
此代码:
class foo {
int bar[] = {111, 123};
};
产生有关灵活数组初始化程序的错误。但是这个:
class foo {
int bar[2] = {111, 123};
};
正常编译。有没有计算我输入的值的解决方法?
不同于你可以做的函数
int foo[] = { 1, 2, 3 };
并且编译器将从初始化程序中推断出 foo
的大小,当您这样做时
struct bar
{
int foo[] = { 1, 2, 3 };
};
你真正拥有的是
struct bar
{
bar() : foo{ 1, 2, 3 } {}
int foo[];
};
这行不通,因为 C++ 不允许像 C 那样的灵活数组。
这给您留下了两个选择。首先是您指定尺寸。这不是最好的解决方案,因为它可能会引入错误,但它会使您免于动态初始化。第二个选项是使用一个类型,在 运行 时间,可以从列表中初始化。例如 std::vector
可以很好地满足该要求。是的,会有一个动态内存分配,但是由于 std::vector
是一个 RAII 类型,你不需要担心它,可以使用默认的构造函数和析构函数。
海湾合作委员会 G++ 9
此代码:
class foo {
int bar[] = {111, 123};
};
产生有关灵活数组初始化程序的错误。但是这个:
class foo {
int bar[2] = {111, 123};
};
正常编译。有没有计算我输入的值的解决方法?
不同于你可以做的函数
int foo[] = { 1, 2, 3 };
并且编译器将从初始化程序中推断出 foo
的大小,当您这样做时
struct bar
{
int foo[] = { 1, 2, 3 };
};
你真正拥有的是
struct bar
{
bar() : foo{ 1, 2, 3 } {}
int foo[];
};
这行不通,因为 C++ 不允许像 C 那样的灵活数组。
这给您留下了两个选择。首先是您指定尺寸。这不是最好的解决方案,因为它可能会引入错误,但它会使您免于动态初始化。第二个选项是使用一个类型,在 运行 时间,可以从列表中初始化。例如 std::vector
可以很好地满足该要求。是的,会有一个动态内存分配,但是由于 std::vector
是一个 RAII 类型,你不需要担心它,可以使用默认的构造函数和析构函数。