如何初始化initializer_list
无序元素的复合?
例如,请考虑以下代码:
#include <unordered_map>
#include <string>
using Type = std::unordered_map<std::string, int>;
void foo(std::initializer_list<Type> l) {}
int main()
{
Type x = {{"xxx", 0}, {"yyy", 1}}; // compile fine
// std::initializer_list<Type> y = {{"xxx", 0}, {"yyy", 1}};
// foo({{"xxx", 0}, {"yyy", 1}});
}
如果我取消注释第一行,我得到(g ++ 6.1.1)错误:
错误:无法将'{{“xxx”,0},{“yyy”,1}}'从''转换为'std :: initializer_list,int&gt; &GT;” std :: initializer_list y = {{“xxx”,0},{“yyy”,1}};
最后,我想做的是能够像第二个注释行一样调用foo
,这也不会编译。
答案 0 :(得分:3)
你错过了一套{}。你需要
{{{"xxx", 0}}, {{"yyy", 1}}}
内部{}
为地图构建的std::pair<std::string, int>
创建std::inializer_list<std::pair<std::string, int>>
。下一级别会为std::inializer_list<std::pair<std::string, int>>
创建每个地图,以构建std::initializer_list<Type>
中的每个地图。最外面的{}
是std::initializer_list<Type>
的范围。我们可以扩展到
foo({{{"xxx", 0}}, {{"yyy", 1},{"zzz", 2}}});
是std::initializer_list<Type>
,其中第一个地图有一个条目,第二个地图有2个。