2016-09-12 73 views
12

我看到的std::mapstd::unordered_mapinsert方法將改變從的std ::在地圖::插入件變化C++ 17

template<class P> std::pair<iterator,bool> insert(P&& value); (C++11) 

std::pair<iterator,bool> insert(value_type&& value); (C++17) 

然而,對於這些容器,value_typestd::pair<A const, int>。這裏有兩個問題:

  1. 爲什麼這個改變?什麼是好處?
  2. 這是如何工作來移動插入的關鍵? C++ 11版本接受任何東西(P的約束爲default_constructible<value_type, P&&>),然後是std::pair<A, int> - 這是大多數時候這個參數的類型,因爲它是由std::make_pair返回的 - 並且可以調用移動構造函數A。但在C++ 17版本中,這個參數被轉換爲value_type,其中A是常量,然後是不可移動的。如果我沒有忽視某些東西,A必須被複制。或者C++ 17是否也改變了這方面的任何東西?

謝謝!

+3

看起來這個功能是由[LWG 2354](http://wg21.link/lwg2354)添加的。 –

+7

它不是「從X到Y」。這是一個額外的過載。 –

回答

9

在C++ 17中添加了一個額外的非模板重載到insert

這樣的超載具有的優點是,它允許基於語法{}的構造.insert({ {key}, {value, args} })template參數不能通過{}基於沒有顯式類型的構造指令。

+0

謝謝;實際上它是一個額外的重載,允許編寫這個基於''''的構造,但它仍然會被視爲一個'std :: pair ',所以我猜你的例子中的'key'不會被移動,但複製...?我真的很確定C++的人想到這一點,它會被移動,我只是不知道*如何*如果它是const :) – AntiClimacus

+0

@AntiClimacus它會調用'std :: pair'的構造函數,不管它們是什麼是。如果'std :: pair '可以通過(比如說)'(Key &&,Value &&)'來構造,那麼數據可以被移入'insert'。但是,它不能被移入樹中的數據中,是的。 – Yakk