2013-02-07 60 views
1

my previous question's answer超載的std :: unordered_map ::插入的重載

std::pair<iterator, bool> std::unordered_map::insert(const value_type&) 

template<class P> 
std::pair<iterator, bool> std::unordered_map::insert(P&&) 

對於某些情況類似

std::unordered_map<std::string, int> v; 
v.insert({"key", 1}); 

有用的,因爲編譯器不能推斷P{"key", 1}。 (感謝sellibitze

然而,雖然這種說法{"key", 1}(= )是prvalue,它不能因爲參數類型爲const value_type&移動到容器中。

我的問題是---我很遺憾要堅持---爲什麼標準選擇const value_type&作爲參數類型而不是value_type&&?或者,是否還有其他原因存在參數類型爲const value_type&的函數存在,並且參數類型爲value_type&&的函數不存在?

編輯: 我創建了一個示例。

+3

'insert'缺少'value_type &&'重載可能是一個疏忽,就像'make_unique'一樣。 – Xeo

+1

「make_unique」的缺失也是故意的。雖然我不反對它在未來的標準。對於C++ 11來說,'unique_ptr'中沒有足夠的專家來回答這樣的問題:你如何處理定製的刪除器?數組類型?我分散得太薄而無法推動它。 –

+0

如果你關心性能,你可能想使用emplace - 可能使用pair的「pairwise constructor」。 – sellibitze

回答

4

爲(​​) 「丟失」 value_type&&過載的insertmultimap是故意的。 value_typepair<const key_type, value_type>key_type上的const在移動語義遊行上幾乎下雨。

我真的很想允許從pair<key_type, value_type>移動過來,因此引入了P&&過載。事後看來,這可能不是最好的解決方案。然而這是一個蓄意的設計決定。

在作出決定時,統一初始化提議沒有出現。所以與標準化之前的互動從未被徹底調查過(只是沒有足夠的時間/人力)。

const value_type&過載來自C++ 98,它從來不是刪除或修改它的考慮因素。