Files
2025-10-25 03:02:53 +03:00

84 lines
4.1 KiB
Markdown
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

[unord.hash]
# 22 General utilities library [[utilities]](./#utilities)
## 22.10 Function objects [[function.objects]](function.objects#unord.hash)
### 22.10.19 Class template hash [unord.hash]
[1](#1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L15566)
The unordered associative containers defined in [[unord]](unord "23.5Unordered associative containers") use
specializations of the class template hash ([[functional.syn]](functional.syn "22.10.2Header <functional> synopsis"))
as the default hash function[.](#1.sentence-1)
[2](#2)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L15573)
Each specialization of hash is either enabled or disabled,
as described below[.](#2.sentence-1)
[*Note [1](#note-1)*:
Enabled specializations meet the [*Cpp17Hash*](hash.requirements#:Cpp17Hash "16.4.4.5Cpp17Hash requirements[hash.requirements]") requirements, and
disabled specializations do not[.](#2.sentence-2)
— *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[.](#2.sentence-3)
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[.](#2.sentence-4)
[3](#3)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L15587)
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[.](#3.sentence-1)
[4](#4)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L15592)
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>, andis_move_assignable_v<H>[.](#4.sentence-1)
Disabled specializations of hash are not function object types ([[function.objects]](function.objects "22.10Function objects"))[.](#4.sentence-2)
[*Note [2](#note-2)*:
This means that the specialization of hash exists, but
any attempts to use it as a [*Cpp17Hash*](hash.requirements#:Cpp17Hash "16.4.4.5Cpp17Hash requirements[hash.requirements]") will be ill-formed[.](#4.sentence-3)
— *end note*]
[5](#5)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L15607)
An enabled specialization hash<Key> will:
- [(5.1)](#5.1)
meet the [*Cpp17Hash*](hash.requirements#:Cpp17Hash "16.4.4.5Cpp17Hash requirements[hash.requirements]") requirements (Table [37](hash.requirements#tab:cpp17.hash "Table 37: Cpp17Hash requirements")),
with Key as the function
call argument type, the [*Cpp17DefaultConstructible*](utility.arg.requirements#:Cpp17DefaultConstructible "16.4.4.2Template argument requirements[utility.arg.requirements]") requirements (Table [30](utility.arg.requirements#tab:cpp17.defaultconstructible "Table 30: Cpp17DefaultConstructible requirements")),
the [*Cpp17CopyAssignable*](utility.arg.requirements#:Cpp17CopyAssignable "16.4.4.2Template argument requirements[utility.arg.requirements]") requirements (Table [34](utility.arg.requirements#tab:cpp17.copyassignable "Table 34: Cpp17CopyAssignable requirements (in addition to Cpp17MoveAssignable)")),
the [*Cpp17Swappable*](swappable.requirements#:Cpp17Swappable "16.4.4.3Swappable requirements[swappable.requirements]") requirements ([[swappable.requirements]](swappable.requirements "16.4.4.3Swappable requirements")),
- [(5.2)](#5.2)
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;
- [(5.3)](#5.3)
meet the requirement that the expression h(k), where h is an object of type hash<Key> and k is an object of typeKey, shall not throw an exception unless hash<Key> is a
program-defined specialization[.](#5.sentence-1)