作为类成员的灵活数组

问题描述 投票:0回答:2

海湾合作委员会 G++ 9

此代码:

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

产生有关灵活数组的初始值设定项的错误。但这一个:

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

正常编译。有什么解决方法可以不计算我输入的值吗?

c++ flexible-array-member
2个回答
6
投票

与您可以执行的功能不同

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 类型,因此您无需担心它,可以使用默认的构造函数和析构函数。


0
投票

到目前为止,接受的答案有点过时了。使用 constexpr std::array。 这还有一个额外的好处,您还可以稍后访问它的大小(无需使用“C”样式 sizeof)

#include <array>

struct bar
{
    static constexpr std::array foo{ 1, 2, 3 };
};


int main()
{
    return bar::foo.size();
}
© www.soinside.com 2019 - 2024. All rights reserved.