В С++ 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, по-видимому, имеет гораздо лучшие требования к своему делетиру.