Я бы предложил вам использовать следующее при попытке вставить std::unique_ptr
в std::map
:
animals.insert(std::make_pair(1, std::unique_ptr<Animal>(new Animal(1,"Tom"))));
или
animals.insert(std::make_pair(1, std::make_unique<Animal>(1,"Tom")));
Во-первых, предпочтительнее использовать std::make_pair
над std::pair
конструктор, потому что с std::pair
вам нужно указать типы обоих элементов, тогда как std::make_pair
будет выводить типы элементов, которые ему передаются.
Во-вторых, как говорит другой ответ, std::unique_ptr
не может быть скопировано, потому что оно уникально. Его можно переместить только на std::move
. В этом случае, поскольку вы передаете ссылку на r-значение в функцию std::make_pair
, она перемещается.