unique_ptr
конструктор explicit
. Таким образом, вы не можете создать его неявно с помощью new string{"foo"}
. Это должно быть что-то вроде unique_ptr<string>{ new string{"foo"} }
.
Что приводит нас к этому
// not good
vector<unique_ptr<string>> vs {
unique_ptr<string>{ new string{"Doug"} },
unique_ptr<string>{ new string{"Adams"} }
};
Однако может произойти утечка в случае сбоя одного из конструкторов. Безопаснее использовать make_unique
:
// does not work
vector<unique_ptr<string>> vs {
make_unique<string>("Doug"),
make_unique<string>("Adams")
};
Но ... initializer_list
s всегда выполняет копии, а unique_ptr
s не копируются. Это действительно раздражает списки инициализаторов. Вы можете взломать его или вернуться к инициализации с вызовами на emplace_back
.
Если вы на самом деле управляете string
с помощью умных указателей, и это не только для примера, то вы можете сделать еще лучше: просто сделайте vector<string>
. std::string
уже обрабатывает ресурсы, которые он использует.