使用VS2013中的initializer_list模糊调用函数

时间:2014-10-02 19:19:32

标签: c++ c++11 visual-studio-2013 initializer-list

我有以下示例代码。它在clang上编译,但在Visual Studio 2013上没有。

#include <iostream>
#include <utility>
#include <string>
using namespace std;

void f(const pair<string, string>& p)
{
    cout << p.first << ", " << p.second << endl;
}

void f(initializer_list<pair<string, string> > ps) {
    for (auto p : ps) f(p);
}

int main()
{
    f({ "2", "3" });
    f({ { "2", "3" }, { "3", "4" } });
}

对f的第二次调用无法编译:

1error C2668: 'f' : ambiguous call to overloaded function
could be 'void f(std::initializer_list<std::pair<std::string,std::string>>)'
or       'void f(const std::pair<std::string,std::string> &)'
1>          while trying to match the argument list '(initializer-list)'

如果我使用int对而不是字符串对,它确实可以正常工作。

有人在Visual Studio中意识到这样的问题吗?或者我做错了什么?

谢谢。

1 个答案:

答案 0 :(得分:2)

{ { "2", "3" }, { "3", "4" } }可用于初始化initializer_list<pair<string, string> >pair<string, string>,在第二种情况下,通过调用std::string的双迭代器构造函数(并导致UB)过程)。两者都是列表初始化序列。两者都调用用户定义的转换。

§13.3.3.2[over.ics.rank] / p3:

  

列表初始化序列L1是比转换序列更好的转换序列   列表初始化序列L2 if:

     
      
  • 对于某些std::initializer_list<X>,L1转换为X,而L2不会[...]
  •   

没有歧义。应明确选择void f(initializer_list<pair<string, string> > ps);