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.Разница между станд :: 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

+0

Попробуйте также 'testum.emplace (станд :: piecewise_construct, станд :: make_tuple (1u), станд :: make_tuple());' – aschepler

+0

Благодарю. Если бы это был ответ, я бы голосовал и отмечен как ответ – zrb

ответ

2

Согласно http://en.cppreference.com/w/cpp/container/unordered_map/operator_at:

2) Вставляет value_type объект, построенный на месте от std::piecewise_construct, std::forward_as_tuple(std::move(key)), std::tuple<>() , если ключ не существует.

(я имею в вид перегрузок Key&&, так как в закомментированную линии, вы используете RValue в качестве аргумента operator[]. Хотя в случае Key=int разница в значительной степени тривиальная.)

Таким образом, в качестве ссылки на ваш вопрос, operator[](Key&&) примерно эквивалентно

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

 Смежные вопросы

  • Нет связанных вопросов^_^