c++ - 在VS2013中使用initializer_list对函数的不明确调用

标签 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 中存在这样的问题吗?还是我做错了什么?

谢谢。

最佳答案

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

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

List-initialization sequence L1 is a better conversion sequence than list-initialization sequence L2 if:

  • L1 converts to std::initializer_list<X> for some X and L2 does not [...]

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

关于c++ - 在VS2013中使用initializer_list对函数的不明确调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26168013/

相关文章:

c++ - QTableWidget 中的 Star Delegate

c++ - 可以采用 lambda 或函数指针并推断参数以传递给另一个模板的模板函数

c++ - 调用函数的可变参数模板

c++ - 为什么不在下面调用我的隐式构造函数

C++用括号声明一个对象

c++ - 有关使用 C++\XAML for Metro 进行 Windows 8 编程的资源和信息

wpf - 如何获取Visual Studio 2013 Express的Blend

visual-c++ - 将 FFMPEG 与 Visual Studio 2013 Express 一起使用的链接器错误

c++ - 在 Objective-C 中使用 C++ 类 - 为什么使用 PImpl 习惯用法?

c++11返回值优化还是搬家?