The unordered associative containers defined in [unord] use
specializations of the class template hash ([functional.syn])
as the default hash function.
Enabled specializations meet the requirements of Hash, and
disabled specializations do not.
—end note
]
Each header that declares the template hash
provides enabled specializations of hash for nullptr_t and
all cv-unqualified arithmetic, enumeration, and pointer types.
For any type Key for which neither the library nor the user provides
an explicit or partial specialization of the class template hash,
hash<Key> is disabled.
If the library provides an explicit or partial specialization of hash<Key>,
that specialization is enabled except as noted otherwise,
and its member functions are noexcept except as noted otherwise.
If H is a disabled specialization of hash,
these values are false:
is_default_constructible_v<H>,
is_copy_constructible_v<H>,
is_move_constructible_v<H>,
is_copy_assignable_v<H>, and
is_move_assignable_v<H>.
Disabled specializations of hash
are not function object types ([function.objects]).
satisfy the Hash requirements ([hash.requirements]),
with Key as the function
call argument type, the DefaultConstructible requirements (Table 22),
the CopyAssignable requirements (Table 26),
satisfy the requirement that if k1 == k2 is true, h(k1) == h(k2) is
also true, where h is an object of type hash<Key> and k1 and k2
are objects of type Key;
satisfy the requirement that the expression h(k), where h
is an object of type hash<Key> and k is an object of type
Key, shall not throw an exception unless hash<Key> is a
user-defined specialization that depends on at least one user-defined type.