C++:数组初始值设定项太多

C++:数组初始值设定项太多,c++,initialization,stdarray,aggregate-initialization,C++,Initialization,Stdarray,Aggregate Initialization,下面的代码返回下面的编译错误。我一直在理解为什么有太多的初始值设定者。这段代码使用vector。是否有人知道报告错误的原因以及如何解决?谢谢 #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}};

下面的代码返回下面的编译错误。我一直在理解为什么有太多的初始值设定者。这段代码使用vector。是否有人知道报告错误的原因以及如何解决?谢谢

#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}};
试一试

构造函数都是隐式定义的,因此数组最终是一种普通的可构造类型。

Try


构造函数都是隐式定义的,因此数组最终是一个普通的可构造类型。

您可以使用以下初始化之一,因为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 } };

您可以使用以下初始化之一,因为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 } };

为什么需要额外的支架?还要注意,我复制的几乎与StruouStrup C++第四ED页面208相同,没有显示错误。@ NoToRB刚刚添加了一个编辑。此构造函数是隐式的。。。如果有手动定义的std::initializer\u list构造函数,那么就不需要它们了;尽管我个人认为这让人很难阅读。@notaorb大括号初始化的语言标准一直在变化;在出版时它可能是正确的!隐式构造类似于结构Z{intx[2];};结构Z zz={{0,1}};。为什么需要额外的支架?还要注意,我复制的几乎与StruouStrup C++第四ED页面208相同,没有显示错误。@ NoToRB刚刚添加了一个编辑。此构造函数是隐式的。。。如果有手动定义的std::initializer\u list构造函数,那么就不需要它们了;尽管我个人认为这让人很难阅读。@notaorb大括号初始化的语言标准一直在变化;在出版时它可能是正确的!隐式构造类似于结构Z{intx[2];};结构Z zz={{0,1}};。std::array的经验法则,如果它不起作用,那么添加额外的大括号,直到它起作用。这是否回答了您的问题?我的问题是std::array的以下经验法则,如果它不起作用,那么在它起作用之前添加额外的大括号。这是否回答了您的问题?我的问题如下。。。他们说C++是严格的:两个答案都是我的选择。为所有不同的初始化版本命名可能会提供一些额外的值。。。。他们说C++是严格的:两个答案都是我的选择。为所有不同的初始化版本命名可能会提供一些额外的价值。
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 } };