template <class T, class D> struct hash<unique_ptr<T, D>>;
Позволить UP БЭ unique_ptr<T,D>, специализация hash<UP> включена ([unord.hash]) , если и только если hash<typename UP::pointer> включена. Если эта функция включена, для объекта p типа UP, hash<UP>()(p) должен оценить и то же значение , как hash<typename UP::pointer>()(p.get()). Функции-члены не гарантируются noexcept.
template <class T> struct hash<shared_ptr<T>>;