#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
.Разница между станд :: unordered_map <K, повышение :: ptr_deque < T >> оператор 's [] (K & Const) и устанавливать
Я думал, что operator [] (K const &)
просто return emplace(k, mapped_type()).first->second
или return insert(value_type(k, mapped_type())).first->second
, который является по существу закомментированы заявления
Видимо, что это не так. operator []
выполняет placement new
магия внутренне?
Или есть что-то особенное о ptr_deque
?
Я использую GCC-6.1 & подталкивание 1,59
Попробуйте также 'testum.emplace (станд :: piecewise_construct, станд :: make_tuple (1u), станд :: make_tuple());' – aschepler
Благодарю. Если бы это был ответ, я бы голосовал и отмечен как ответ – zrb