Как переместить элементы контейнера умных указателей?
Имеется контейнер умных указателей. Требуется записать их в другой контейнер с передачей владения. но при попытке вызова функции insertParameter внутри цикла возникает ошибка вызова удалённого конструктора.
void Module::insertParameter(unique_ptr<Parameter> p)
{
some_list.append(move(p));
}
void Module::insertParameter(initializer_list<unique_ptr<Parameter>> plist)
{
for (auto &p : plist)
{
insertParameter(move(p));
}
}
Собственно, как организовать перемещение умных указателей в цикле range for?
Ответы (1 шт):
Автор решения: KoVadim
→ Ссылка
у initializer_list есть одна плохая особенность - он делает копии. И если Ваши данные только для перемещения - у Вас проблема. Вот люди спрашивают похожее
https://stackoverflow.com/questions/8193102/initializer-list-and-move-semantics
То есть, у Вас проблема не в цикле, а в initializer_list.
Что делать?
- не использовать initializer_list.
- передавать через контейнер
- написать обертку для умного указателя, которая умеет копироваться (да, будет такая себе матрешка)
- посмотреть на emplace_back и реализовать себе через шаблоны.