2014-10-02 33 views
2

我有以下示例代碼。它編譯於鏗鏘而不是2013年。使用VS2013中的initializer_list函數的模糊調用

#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的第二個調用失敗,編譯它在Visual Studio中:

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中有這樣的問題?或者我做錯了什麼?

謝謝。

+0

我幾乎可以肯定,我在bug報告中看到過類似的東西。 – 2014-10-02 19:37:08

+0

我懷疑第二個調用被解釋爲f(pair(string(「2」,「3」),string(「 (「const char *」指針是有效的迭代器),除了「初始化器對列表」的解釋之外,還使用帶有一對迭代器的「std :: string」的構造函數。關於我的頭頂,我不能說這樣的解釋是否合法。 – 2014-10-02 19:39:32

+0

@IgorTandetnik是否有'pair'的初始化列表ctor? – Yakk 2014-10-02 20:35:09

回答

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更好的轉換序列,如果:

  • L1轉換成std::initializer_list<X>一些X和L2不[...]

的再也沒有歧義。應該明確選擇void f(initializer_list<pair<string, string> > ps);