#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
Versuchen Sie auch 'testum.emplace (std :: piecewise_construct, std :: make_tuple (1U), std :: make_tuple());' – aschepler
Vielen Dank. Wenn dies eine Antwort gewesen wäre, würde ich mich für eine Antwort entscheiden – zrb