------- Comment #12 from redi at gcc dot gnu dot org 2010-03-01 22:38 ------- Bear in mind that a custom deleter with custom pointer type might have very different semantics for comparing pointer values and for invoking the deleter. Consider a custom D::pointer which keeps a generation count, which is not used when comparing for equality:
template<class T> struct MyDeleter { struct pointer { int generation; T* ptr; pointer() : generation(), ptr() { } bool operator==(pointer rhs) { return ptr == rhs.ptr; } }; void operator()(pointer p) const { do_something(ptr.generation); delete p.ptr; } void do_something(int gen); }; Your suggested implementation would not update the value, because the equality test is true, but that would be wrong i.e. you would have failed to reset the unique_ptr as requested by the user. -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43183