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()); 
} 

Im obigen Beispiel einzulagern, die kommentiert aus Linien zusammenstellen nicht, wie sie versuchen, kopiere Elemente der ptr_deque, die nicht kopierbar sind. Das Formular push_back funktioniert jedoch.Unterschied zwischen std :: unordered_map <K boost :: ptr_deque < T >> 's operator [] (K const &) und

Ich dachte, dass operator [] (K const &) ist einfach return emplace(k, mapped_type()).first->second oder return insert(value_type(k, mapped_type())).first->second, die im Wesentlichen der auf Kommentar Aussagen sind

Offenbar dies nicht der Fall ist. Führt operator [] einige placement new Magie intern durch?

Oder gibt es etwas Besonderes über ptr_deque?

ich gcc-6.1 & Boost 1,59

+0

Versuchen Sie auch 'testum.emplace (std :: piecewise_construct, std :: make_tuple (1U), std :: make_tuple());' – aschepler

+0

Vielen Dank. Wenn dies eine Antwort gewesen wäre, würde ich mich für eine Antwort entscheiden – zrb

Antwort

2

Nach http://en.cppreference.com/w/cpp/container/unordered_map/operator_at bin mit:

2) Fügt ein value_type Objekt konstruiert an Ort und Stelle von std::piecewise_construct, std::forward_as_tuple(std::move(key)), std::tuple<>() , wenn der Schlüssel nicht existiert.

(Ich beziehe mich auf die Key&& seit Überlastung in der Zeile auf Kommentar, sind Sie einen R-Wert als Argument an operator[] verwenden. Obwohl im Fall von Key=int der Unterschied ziemlich trivial.)

Also auf Ihre Frage in Bezug, operator[](Key&&) auf entspricht in etwa

return emplace(std::piecewise_construct, 
       std::forward_as_tuple(std::move(k)), 
       std::tuple<>()).first->second; 
Verwandte Themen