2014-01-19 80 views
1

也許我很愚蠢,但我沒看到這個代碼的問題是什麼。我開始懷疑我的工具。我正在使用Clang(C++ 11)和它的libC++。如果是我的錯,我很抱歉,並事先誰指出我的愚蠢感謝,但如果沒有的話,也許這是一個更深層次的問題..聲明模板類型來調用make_pair

std::map<int, bool> map_; 

map_.insert(std::make_pair<int, bool>(5, true)); //Use a literal, compiles OK 

int x = 5; 
map_.insert(std::make_pair<int, bool>(x, true)); //Use a local of same type, compile error: 'no known conversion from 'int' to 'int &&' for 1st argument' 
+4

你不應該提供模板參數,但讓扣做的工作:'的std :: make_pair(X,真) ' – juanchopanza

+0

'std :: make_pair'通常會接受並給它一個'int&&&',或'int&'類型。現在你已經去做了'int &&',它不能用於左值。 – chris

+0

是的,修復它。但我想知道爲什麼......強制執行匹配參數的函數的模板版本應該會產生相同的實現,當然? – NitrousUK

回答

8

std::make_pair需要"universal reference"它的參數。通用引用可以綁定到幾乎任何東西。這是實際的簽名:

template< class T1, class T2 > 
constexpr std::pair<V1,V2> make_pair(T1&& t, T2&& u); 
//         ^^^^^^^^^^^^^^ 

當你明確地提供類型(不必要的我可以補充),它把函數調用到這一點:

... (int&& t, bool&& u); 

意義參數不再是通用引用,而是右值引用。右值引用只能綁定到右值,而不是右值,因此第一個參數的錯誤。

對這一問題的解決方案是允許模板實參推演做的工作:

map_.insert(std::make_pair(x, true));