Как унифицировать инициализацию карты 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;

   ^

2 ответа

Решение

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

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

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

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

или даже проще без typedef с использованием make_pair:

auto const mapInstance([]()
{
   std::map<uint32_t, std::unique_ptr<int>> m;
   m.insert(std::make_pair(0x0023, std::make_unique<int>(23)));
   return m;
}());
Другие вопросы по тегам