Невозможно вставить std :: unique_ptr с пользовательским средством удаления с помощью std :: move

Я использую std::unique_ptr с пользовательским удалителем в качестве значения std::map следующее:

#include <iostream>
#include <memory>
#include <map>

void deleter(int* p){
std::cout<<"Deleting..."<<std::endl;
delete p;
}

int main()
{
std::map<char, std::unique_ptr<int, void(*)(int*)>> a;
std::unique_ptr<int, void(*)(int*)> p{new int{3}, deleter};
a['k'] = std::move(p);
}

При вставке значения я использую std::move, но он не скомпилируется.

Что я делаю неправильно?

Вы видите ошибки по ссылке.

https://wandbox.org/permlink/fKL4QDkUTDsj4gDc

0

Решение

a['k'] по умолчанию создаст тип значения карты, если ключ не существует. Так как ваш unique_ptr использует пользовательский удалитель, он не может быть создан по умолчанию. Вам придется использовать либо map::emplace() или же map::insert() добавить unique_ptr на карту. Если вы хотите узнать, существует ли элемент, или нет, прежде чем вы это сделаете, вы можете использовать либо map::count() или же map::find().

Если вы можете использовать C ++ 17, вы можете использовать map::try_emplace() вместо этого, который только добавит объект, если ключ не существует, сохраняя вас поиск.

5

Другие решения

Ошибка заключается в построении записи по умолчанию перед назначением!

Извините, что нет времени прорабатывать ответ, но в целом я бы использовал вместо этого вставку?

0

По вопросам рекламы [email protected]