2016-08-24 50 views
0
#include <memory> 
#include <unordered_map> 
#include <vector> 
#include <utility> 
#include <boost/ptr_container/ptr_deque.hpp> 

struct T 
{ 
    T() = default; 
    T(T const &) = delete; 
    T & operator = (T const &) = delete; 
    T(T &&) = default; 
    T & operator = (T &&) = default; 
}; 

using S = boost::ptr_deque <T>; 

int main() 
{ 
    std::unordered_map < uint32_t, S > testum; 
    // testum.emplace(1u, S()); 
    // testum.insert(std::make_pair(1u, S())); 
    testum[1].push_back(new T()); 
} 

在上面的例子中,註釋行不進行編譯,因爲他們試圖複製不可複製的ptr_deque的元素。但是,push_back窗體的工作。差分<K,升壓:: ptr_deque < T >>的操作符[](K常量&)和佈設

我在想,operator [] (K const &)簡直是return emplace(k, mapped_type()).first->secondreturn insert(value_type(k, mapped_type())).first->second,這在本質上是註釋語句

顯然事實並非如此。 operator []在內部執行一些placement new魔法嗎?

或者有什麼特別的關於ptr_deque

我使用GCC-6.1 &升壓1.59

+0

嘗試也'testum.emplace(STD :: piecewise_construct,性病:: make_tuple(1U)的std :: make_tuple());' – aschepler

+0

謝謝。如果這是一個答覆,我會投票並標記爲答案 – zrb

回答

2

根據http://en.cppreference.com/w/cpp/container/unordered_map/operator_at

2)插入,如果鍵不存在就地從 std::piecewise_construct, std::forward_as_tuple(std::move(key)), std::tuple<>() 構造的value_type對象。

(我指的是Key&&超載,因爲在註釋掉線,您使用的是右值作爲參數傳遞給operator[],雖然在Key=int的情況下,差異是非常微不足道的。)

因此,在參考你的問題,operator[](Key&&)大致相當於

return emplace(std::piecewise_construct, 
       std::forward_as_tuple(std::move(k)), 
       std::tuple<>()).first->second; 
相關問題