簡體   English   中英

無法使用帶有std :: move的自定義刪除器插入std :: unique_ptr

[英]Cannot insert std::unique_ptr with custom deleter with 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

如果鍵不存在,則a['k']將默認構造映射的值類型。 由於您的unique_ptr使用自定義刪除器,因此默認無法構建。 您將必須使用map::emplace()map::insert()unique_ptr添加到地圖中。 如果要在此之前知道元素是否存在,可以使用map::count()map::find()

如果可以使用C ++ 17,則可以改用map::try_emplace() ,它將僅在鍵不存在時添加對象,從而節省了查找時間。

該錯誤在於分配前地圖條目的默認構造!

對不起,沒有時間來解決這個問題,但是通常我會使用插入代替嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM