我有以下示例代码。它在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而不是成对的string,它确实可以正常工作。
有人知道Visual Studio中有这样的问题吗?还是我做错了什么?
谢谢。
{ { "2", "3" }, { "3", "4" } }
可以用于初始化initializer_list<pair<string, string> >
或pair<string, string>
,在第二种情况下,通过调用std::string
的两个迭代器构造函数(并在过程中导致UB)。两者都是列表初始化序列。两者都调用用户定义的转换。
§13.3.3.2[等级]/p3:
列表初始化序列L1是比如果:,则列出初始化序列L2
- 对于某些
X
,L1转换为std::initializer_list<X>
,而L2不[…]
没有歧义。应明确选择void f(initializer_list<pair<string, string> > ps);
。