C++ 如何使用自定义结构初始化boost::array?

C++ 如何使用自定义结构初始化boost::array?,c++,boost,c++11,struct,aggregate-initialization,C++,Boost,C++11,Struct,Aggregate Initialization,我正在寻找一个很好的解决方案,就是如何用自定义的用户结构和数据初始化静态的boost::array。下面是我对boost::array的期望示例: struct Foo { std::string a; std::string b; }; static boost::array< Foo, 2 > foo = { { "111", "222" }, { "333", "444" }, }; 我错过了什么 Thnks 添加一

我正在寻找一个很好的解决方案,就是如何用自定义的用户结构和数据初始化静态的
boost::array
。下面是我对
boost::array
的期望示例:

 struct Foo
 {
      std::string a;
      std::string b;
 };
 static boost::array< Foo, 2 > foo =
 {
      { "111", "222" },
      { "333", "444" },
 };
我错过了什么


Thnks

添加一组额外的大括号对我很有用

 static boost::array< Foo, 2 > foo =
 {{
    { "111", "222" },
    { "333", "444" },
 }};
staticboost::arrayFoo=
{{
{ "111", "222" },
{ "333", "444" },
}};
当我弄清楚原因后,我会更进一步。我认为这里的关键是“括号省略”(感谢jesyspa给我指出了这一点)

这也适用于:

 static boost::array< Foo, 2 > foo =
 {
    "111", "222",
    "333", "444",
 };
staticboost::arrayFoo=
{
"111", "222",
"333", "444",
};

添加一组额外的大括号对我很有用

 static boost::array< Foo, 2 > foo =
 {{
    { "111", "222" },
    { "333", "444" },
 }};
staticboost::arrayFoo=
{{
{ "111", "222" },
{ "333", "444" },
}};
当我弄清楚原因后,我会更进一步。我认为这里的关键是“括号省略”(感谢jesyspa给我指出了这一点)

这也适用于:

 static boost::array< Foo, 2 > foo =
 {
    "111", "222",
    "333", "444",
 };
staticboost::arrayFoo=
{
"111", "222",
"333", "444",
};

这是由大括号省略的工作方式造成的。根据N3485第8.5.1.11节:

大括号可以在初始值设定项列表中省略,如下所示。如果初始值设定项列表以左大括号开始,则后续的逗号分隔的初始值设定项子句列表将初始化子集合的成员;初始化条款比成员多是错误的。但是,如果子集合的初始值设定项列表不以左大括号开头,则仅从列表中选取足够的初始值设定项子句来初始化子集合的成员;剩下的任何初始值设定项子句都留作初始化当前子集合所属集合的下一个成员

换句话说,如果接下来是一个初始值设定项列表,我们可以假设没有发生大括号省略。大括号是在最内层插入的,因此我们希望

{{"a", "b"}, {"c", "d"}}  -> {{{"a", "b"}, {"c", "d"}}}
相反,我们得到的是

{{"a", "b"}, {"c", "d"}} -> {{{"a", "b"}}, {"c", "d"}}
现在,关于为什么我们可以省略更多的大括号并编写
{“a”、“b”、“c”、“d”}
:一旦我们点击
“a”
,我们就知道大括号省略已经发生了,因为我们期望数组成员用初始值设定项列表进行初始化。因此,我们开始使用初始化成员数组所需的尽可能多的初始值设定项子句。我们再次点击
“a”
,而不是初始值设定项列表,因此我们开始根据需要使用尽可能多的初始值设定项子句来初始化第一个
Foo
。我们在第二个
Foo
中重复这一点,使用所有子句,并以

{"a", "b", "c", "d"} -> {{{"a", "b"}, {"c", "d"}}}

根据需要。

这是由于大括号省略的工作方式造成的。根据N3485第8.5.1.11节:

大括号可以在初始值设定项列表中省略,如下所示。如果初始值设定项列表以左大括号开始,则后续的逗号分隔的初始值设定项子句列表将初始化子集合的成员;初始化条款比成员多是错误的。但是,如果子集合的初始值设定项列表不以左大括号开头,则仅从列表中选取足够的初始值设定项子句来初始化子集合的成员;剩下的任何初始值设定项子句都留作初始化当前子集合所属集合的下一个成员

换句话说,如果接下来是一个初始值设定项列表,我们可以假设没有发生大括号省略。大括号是在最内层插入的,因此我们希望

{{"a", "b"}, {"c", "d"}}  -> {{{"a", "b"}, {"c", "d"}}}
相反,我们得到的是

{{"a", "b"}, {"c", "d"}} -> {{{"a", "b"}}, {"c", "d"}}
现在,关于为什么我们可以省略更多的大括号并编写
{“a”、“b”、“c”、“d”}
:一旦我们点击
“a”
,我们就知道大括号省略已经发生了,因为我们期望数组成员用初始值设定项列表进行初始化。因此,我们开始使用初始化成员数组所需的尽可能多的初始值设定项子句。我们再次点击
“a”
,而不是初始值设定项列表,因此我们开始根据需要使用尽可能多的初始值设定项子句来初始化第一个
Foo
。我们在第二个
Foo
中重复这一点,使用所有子句,并以

{"a", "b", "c", "d"} -> {{{"a", "b"}, {"c", "d"}}}

根据需要。

这也适用于std::array。我在这里留下这条评论是希望搜索引擎在搜索std::array问题时能更高地显示这个问题。这也适用于std::array。我在这里留下这条评论是希望搜索引擎在谷歌搜索std::array问题时能更高地显示这个问题。