В С++ 11 std::shared_ptr
имеет четыре конструктора, которые могут быть переданы объектам deleter d
типа d
. Подписи этих конструкторов следующие:
template<class Y, class D> shared_ptr(Y * p, D d);
template<class Y, class D, class A> shared_ptr(Y * p, D d, A a);
template <class D> shared_ptr(nullptr_t p, D d);
template <class D, class A> shared_ptr(nullptr_t p, D d, A a);
Стандарт требует в [util.smartptr.shared.const] типа d
для копирования. Почему это необходимо? Если shared_ptr
создает копии d
, то какой из этих удалений может быть вызван? Разве не удалось бы shared_ptr
сохранить только один делетер? Что значит для shared_ptr
владеть удалением, если d
можно скопировать?
В чем обоснование требования CopyConstructible?
PS: Это требование может затруднить запись дескрипторов для shared_ptr
. unique_ptr
, по-видимому, имеет гораздо лучшие требования к своему делетиру.