![](/img/trans.png)
[英]Explicit constructor and initialization with 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_map
的Type
列表,每个列表一对。
{{{"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.