繁体   English   中英

初始化std :: initializer_list

[英]Initialization of std::initializer_list

如何初始化无序元素的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>>'std :: initializer_list y = {{{“ xxx”, 0},{“ yyy”,1}};

最后,我想做的就是能够像第二条注释行一样调用foo ,它也不会编译。

您缺少一组{}。 你需要

{{{"xxx", 0}}, {{"yyy", 1}}}

内部{}为构建地图的std::inializer_list<std::pair<std::string, int>>创建一个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。

您缺少大括号。 {{"xxx", 0}, {"yyy", 1}}Type的很好的初始化方法,但是对于Type列表,其中只包含一个unordered_map ,则需要

{{{"xxx", 0}, {"yyy", 1}}}

或者对于包含两个unordered_mapType列表,每个列表一对。

{{{"xxx", 0}}, {{"yyy", 1}}}

在第2行中,您尝试初始化std :: unordered_map的std :: initializer_list,但是您仅为其提供了unordered_map的参数。 添加另一组大括号将解决此问题。

#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
    //initialization for std::unordered_map<std::string, int>
    // std::initializer_list<Type> y = {{"xxx", 0}, {"yyy", 1}}; 

    //correct initialization, each std::unordered_map has exactly 1 element in it
    std::initializer_list<Type> y = { {{"xxx", 0}}, {{"yyy", 1}}}

    // foo({{"xxx", 0}, {"yyy", 1}}); //As before
    foo({{{"xxx", 0}}, {"yyy", 1}}}); //Correct call
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM