unordered_set建构歧义

时间:2015-03-20 13:54:22

标签: c++ c++11

当我使用三个或更多项的初始化列表构造一个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检测到错误。

我很确定我可以抛弃这个错误,但我很好奇为什么编译器会为这种情况扼杀。有什么想法吗?

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"};