std :: initializer_list的初始化

时间:2016-08-15 19:26:29

标签: c++ c++11 c++14

如何初始化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,这也不会编译。

1 个答案:

答案 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个。