4

constexpr static int const好的,所以我试图通过在编译时初始化一堆数组来做一些聪明的事情。尽管运行时性能根本不受初始化这些数组的控制,但这似乎是一个有趣的小练习。我写了一个测试设置来看看它是否可能,我最终能够做到这一点:

struct Test
{
    constexpr static int const array[10] = Array<int, 10, 0, Increment>::array;
};

constexpr int const Test::array[10];

int main()
{
    cout << Test::array[3] << '\n';
}

在这里,Array有一个名为的静态成员array,它包含 10int秒,从 0 开始,其中每个后续元素的值由称为Increment(ie {0, 1, ..., 9}) 的模板元编程函子确定。正如预期的那样,程序打印出 number 3

太棒了,对吧?我现在可以编写仿函数并在编译时初始化数组将各种时髦的模式。下一步:通过制作Test这样的类模板来取消对数组大小 10 的硬编码:

template <size_t Size>
struct Test
{
    constexpr static int const array[Size] = Array<int, Size, 0, Increment>::array;
};

template <size_t Size>
constexpr int const Test<Size>::array[Size];

int main()
{
    cout << Test<10>::array[3] << '\n';
}

但是,突然之间,它不再与以下消息一起编译:

test.cc:43:72: error: array must be initialized with a brace-enclosed initializer

为什么会这样?一旦我将类变成类模板,这种初始化是否会变得无效,或者我是否偶然发现了 GCC 中未实现/错误的东西?

仅供参考,我可以根据Array要求发布我的其余代码(例如实现)。现在我认为这应该足够了。

编辑该错误可以通过不同的、微不足道的实现来重现,Array以节省一些空间:

template <size_t Size>
struct Array
{
    constexpr static int const array[Size] = {};
};

template <size_t Size>
struct Test
{
    constexpr static int const array[Size] = Array<Size>::array;
};
4

1 回答 1

4

跟随是非法的;

static const int a[10] = {};
static const int b[10] = a; // Illegal

所以gcc的bug其实是针对非模板的情况。

您可以使用std::array代替 C 数组。

于 2014-01-29T16:30:17.557 回答