![](/img/trans.png)
[英]Why does unique_ptr have the deleter as a type parameter while shared_ptr doesn't?
[英]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.