当我使用三个或更多项的初始化列表构造一个unordered_set时,我的编译器(Solstudio 12.4)编译时没有抱怨:
unordered_set<string> sam({"a", "b", "c"});
但是,如果我将初始化列表中的项目数减少到2,则编译器会抱怨
unordered_set<string> bob({"a", "b"});
错误:重载
之间的歧义&#34;的std :: unordered_set, 的std :: equal_to, 的std ::分配器&GT; :: unordered_set( 的std :: initializer_list, unsigned long,const std :: hash&amp;,const std :: equal_to&amp;,const 的std ::分配器&安培;)&#34;和
&#34; std :: unordered_set,std :: equal_to, 的std ::分配器&GT; :: unordered_set( std :: unordered_set,std :: equal_to, 的std ::分配器&GT;&安培;&安培;)&#34 ;. 1检测到错误。
我很确定我可以抛弃这个错误,但我很好奇为什么编译器会为这种情况扼杀。有什么想法吗?
答案 0 :(得分:1)
看起来您的编译器存在错误,因为当您从initializer_list
构造函数构造时,应该优先接收initializer_list
。
在你的情况下,第二个构造函数是复制构造函数,因此,看起来编译器有两个变体:
unordered_set<string> bob(unordered_set<string>{"a", "b"})
和
unordered_set<string> bob({"a", "b"});
感谢 0x499602D2 ,为了解释,实际上unordered_set
有构造函数,需要两个迭代器,在你的情况下编译器接受它,这是不正确的,因为initializer_list
构造函数应该优先考虑。
您可以尝试使用以下内容:
unordered_set<string> bob{"a", "b"};