C++: array<> 太多的初始值设定项

C++: array<> too many initializers

以下代码返回下面的编译错误。我无法理解如何有太多的初始值设定项。此代码使用 vector<X> 有效。有谁知道为什么会报告错误以及如何解决?谢谢

#include <iostream>
#include <array>
using namespace std;

struct X {
    int x, y;
};

int main(int argc, char *argv[])
{
    array<X,2> a0 = {{0,1}, {2,3}};

    for (auto& p : a0) {
        cout << p.x << endl;
        cout << p.y << endl;
    }

    return 0;
}

编译:

g++ -pedantic -Wall test116.cc && ./a.out
test116.cc: In function ‘int main(int, char**)’:
test116.cc:11:34: error: too many initializers for ‘std::array<X, 2>’
     array<X,2> a0 = {{0,1}, {2,3}};

尝试

array<X,2> a0 = {{{0,1}, {2,3}}};

注意额外的一对大括号。

看起来有点奇怪,但它是这样的,因为 array 的唯一成员是实际数组:

template <class T, size_t N>
class array {
    T val[N];
    // ...
};

构造函数都是隐式定义的,因此 array 最终成为一个简单的可构造类型。

您可以使用以下初始化之一,因为 std::array 是一个包含另一个聚合作为其数据成员的聚合。

array<X,2> a0 = { { { 0, 1 }, { 2, 3 } } };
array<X,2> a0 = { 0, 1, 2, 3 };
array<X,2> a0 = { { 0, 1, 2, 3 } };
array<X,2> a0 = { { 0, 1, { 2, 3 } } };
array<X,2> a0 = { { { 0, 1 }, 2, 3 } };

我发现我的问题和版本的g++有关9.4.0没问题,5.4 .0不是。g++的版本。顺便说一句,g++的版本一般是和系统版本相关联的。