for (auto i : v5) {
i->go();
}
Должно быть
for (auto& i : v5) { // note 'auto&'
i->go();
}
В противном случае вы попытаетесь скопировать текущий элемент.
Кроме того, вы не можете использовать такой список инициализаторов, потому что конструкторыstd::unique_ptr
и std::shared_ptr
помечены explicit
.Вам нужно сделать что-то вроде этого:
#include <iterator> // make_move_iterator, begin, end
template<class T>
std::unique_ptr<T> make_unique(){ // naive implementation
return std::unique_ptr<T>(new T());
}
std::unique_ptr<Base> v1_init_arr[] = {
make_unique<Derived>(), make_unique<Derived>(), make_unique<Derived>()
};
// these two are only for clarity
auto first = std::make_move_iterator(std::begin(v1_init_arr));
auto last = std::make_move_iterator(std::end(v1_init_arr));
std::vector<std::unique_ptr<Base>> v1(first, last);
std::vector<std::shared_ptr<Base>> v2 = {
std::make_shared<Derived>(),
std::make_shared<Derived>(),
std::make_shared<Derived>()
};
И это Good Thing ™, потому что в противном случае вы можете потерять память (если выдает один из более поздних конструкторов, первые еще не связаны сумные указатели).Подсказка для unique_ptr
необходима, поскольку списки инициализатора копируют свои аргументы, а поскольку unique_ptr
s не копируются, вы получите проблему.
Тем не менее, яиспользуйте std::map<std::string, std::unique_ptr<LoaderBase>>
для словаря загрузчиков в одном из моих проектов.