2013-06-18 2 views
6

У меня есть этот код для инициализации карты из в в unique_ptr.Как равномерно инициализировать карту unique_ptr?

auto a = unique_ptr<A>(new A()); 
map<int, unique_ptr<A>> m; 
m[1] = move(a); 

Могу ли я использовать единую инициализацию этого? Я попробовал

map<int, unique_ptr<A>> m {{1, unique_ptr<A>(new A())}};  

Но у меня есть ошибка.

Некоторая часть сообщения об ошибке

In instantiation of 'std::_Rb_tree_node<_Val>::_Rb_tree_node(_Args&& ...) [with _Args = {const std::pair<const int, std::unique_ptr<A, std::default_delete<A> > >&}; _Val = std::pair<const int, std::unique_ptr<A> >]': ... In file included from /opt/local/include/gcc48/c++/memory:81:0, 
       from smart_pointer_map.cpp:3: /opt/local/include/gcc48/c++/bits/unique_ptr.h:273:7: error: declared here 
     unique_ptr(const unique_ptr&) = delete; 

^
+0

Какова была ошибка? Сбой программы при ее запуске? –

+0

Возможный дубликат [Почему я не могу нажать \ _back уникальный \ _ptr в вектор?] (Http://stackoverflow.com/questions/3283778/why-can-i-not-push-back-a-unique- PTR-в-а-вектор) –

ответ

7

unique_ptr подвижен, но не копируемые. initializer_list требует копировальных материалов; вы не можете переместить что-то из initializer_list. К сожалению, я считаю, что то, что вы хотите сделать, невозможно.

Кстати, было бы более полезно узнать, какую конкретную ошибку вы получили. В противном случае мы должны угадать, сделали ли вы что-то неправильно и что, или то, что вы хотите сделать, не реализовано в вашем компиляторе или просто не поддерживается на этом языке. (Это наиболее полезно вместе с минимальным кодом воспроизведения.)

0

Как обходной путь, и особенно, когда вы хотите иметь const map, содержащий unique_ptr, вы можете использовать lambda, выполненный на месте. Это не список инициализатора, но результат аналогичен:

typedef std::map<uint32_t, std::unique_ptr<int>> MapType; 
auto const typeMap([]() 
{ 
    MapType m; 
    m.insert(MapType::value_type(0x0023, std::make_unique<int>(23))); 
    return m; 
}());