The std::unique_ptr template has two parameters: the type of the pointee, and the type of the deleter. This second parameter has a default value, so you usually just write somet
Another reason, in addition to the one pointed out by DeadMG, would be that it's possible to write
std::unique_ptr<int[]> a(new int[100]);
and ~unique_ptr
will call the correct version of delete
(via default_delete<_Tp[]>
) thanks to specializing for both T
and T[]
.
Part of the reason is that shared_ptr
needs an explicit control block anyway for the ref count and sticking a deleter in isn't that big a deal on top. unique_ptr
however doesn't require any additional overhead, and adding it would be unpopular- it's supposed to be a zero-overhead class. unique_ptr
is supposed to be static.
You can always add your own type erasure on top if you want that behaviour- for example, you can have unique_ptr<T, std::function<void(T*)>>
, something that I have done in the past.