簡體   English   中英

為什么unique_ptr不能推斷出刪除器的類型?

[英]Why can't unique_ptr infer the type of the deleter?

假設我想使用帶有unique_ptr的自定義刪除器:

void custom_deleter(int* obj)
{
    delete obj; 
}

為什么我要寫這個:

std::unique_ptr<int, void(*)(int*)> x(new int, custom_deleter);

而不是這個:

std::unique_ptr<int> x(new int, custom_deleter); //does not compile

不能推斷出刪除器的類型嗎?

對於unique_ptr ,刪除器是類型的一部分:

template <
    class T,
    class Deleter = std::default_delete<T>
> class unique_ptr;

因此,在構建對象時,需要指定其類型。 你寫的這行:

std::unique_ptr<int> x(new int, custom_deleter);

相當於:

std::unique_ptr<int, std::default_delete<int> > x(new int, custom_deleter);

而且你不能從custom_deleter構造一個std::default_delete<int>

推斷刪除類型的唯一方法是在該部分上使用模板推導:

template <typename T, typename Deleter>
std::unique_ptr<T, Deleter> make_unique_ptr(T* ptr, Deleter deleter) {
    return std::unique_ptr<T, Deleter>(ptr, deleter);
}

它無法推斷刪除器的類型,因為默認情況下unique_ptr沒有專門用於刪除器的狀態:默認刪除器是無狀態的。

在你的情況下,刪除器需要一個指針的狀態值,因此它不能“適應” std::unique_ptr的狀態(它只是指向T的指針)。

這使得unique_ptr成為擁有指針的輕量級,幾乎無成本的替代品。

可以完成Deductin,但必須更改結果unique_ptr的類型。

相比之下, shared_ptr總是具有刪除器的狀態容量,兩個不同的原子計數器和一個指向值的指針。 它的重量更重,而且不是指針的免費替代品。

暫無
暫無

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

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