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 Cpp17Hash requirements, 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]).
meet the Cpp17Hash requirements (Table 37),
with Key as the function
call argument type, the Cpp17DefaultConstructible requirements (Table 30),
the Cpp17CopyAssignable requirements (Table 34),
the Cpp17Swappable requirements ([swappable.requirements]),
meet 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;
meet 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
program-defined specialization.