Невозможно вставить std :: unique_ptr с пользовательским средством удаления с помощью std :: move - PullRequest
0 голосов
/ 28 июня 2018

Я использую 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

Ответы [ 2 ]

0 голосов
/ 28 июня 2018

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

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

0 голосов
/ 28 июня 2018

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

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

...