Как переместить элементы контейнера умных указателей?

Имеется контейнер умных указателей. Требуется записать их в другой контейнер с передачей владения. но при попытке вызова функции 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 и реализовать себе через шаблоны.
→ Ссылка