This commit is contained in:
2025-10-25 03:02:53 +03:00
commit 043225d523
3416 changed files with 681196 additions and 0 deletions

View File

@@ -0,0 +1,84 @@
[nullablepointer.requirements]
# 16 Library introduction [[library]](./#library)
## 16.4 Library-wide requirements [[requirements]](requirements#nullablepointer.requirements)
### 16.4.4 Requirements on types and expressions [[utility.requirements]](utility.requirements#nullablepointer.requirements)
#### 16.4.4.4 *Cpp17NullablePointer* requirements [nullablepointer.requirements]
[1](#1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/lib-intro.tex#L2018)
A *Cpp17NullablePointer* type is a pointer-like type that supports null values[.](#1.sentence-1)
A type P meets the *Cpp17NullablePointer* requirements if
- [(1.1)](#1.1)
P meets the [*Cpp17EqualityComparable*](utility.arg.requirements#:Cpp17EqualityComparable "16.4.4.2Template argument requirements[utility.arg.requirements]"),[*Cpp17DefaultConstructible*](utility.arg.requirements#:Cpp17DefaultConstructible "16.4.4.2Template argument requirements[utility.arg.requirements]"), [*Cpp17CopyConstructible*](utility.arg.requirements#:Cpp17CopyConstructible "16.4.4.2Template argument requirements[utility.arg.requirements]"), *Cpp17CopyAssignable*,[*Cpp17Swappable*](swappable.requirements#:Cpp17Swappable "16.4.4.3Swappable requirements[swappable.requirements]"), and [*Cpp17Destructible*](utility.arg.requirements#:Cpp17Destructible "16.4.4.2Template argument requirements[utility.arg.requirements]") requirements,
- [(1.2)](#1.2)
the expressions shown in Table [36](#tab:cpp17.nullablepointer "Table 36: Cpp17NullablePointer requirements") are
valid and have the indicated semantics, and
- [(1.3)](#1.3)
P meets all the other requirements of this subclause[.](#1.sentence-2)
[2](#2)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/lib-intro.tex#L2032)
A value-initialized object of type P produces the null value of the type[.](#2.sentence-1)
The null value shall be equivalent only to itself[.](#2.sentence-2)
A default-initialized object
of type P may have an indeterminate or erroneous value[.](#2.sentence-3)
[*Note [1](#note-1)*:
Operations involving indeterminate values can cause undefined behavior, and
operations involving erroneous values can cause erroneous behavior ([[basic.indet]](basic.indet "6.8.5Indeterminate and erroneous values"))[.](#2.sentence-4)
— *end note*]
[3](#3)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/lib-intro.tex#L2041)
An object p of type P can be[contextually converted to bool](conv#def:conversion,contextual_to_bool "7.3Standard conversions[conv]")[.](#3.sentence-1)
The effect shall be as if p != nullptr had been evaluated in place of p[.](#3.sentence-2)
[4](#4)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/lib-intro.tex#L2047)
No operation which is part of the *Cpp17NullablePointer* requirements shall exit
via an exception[.](#4.sentence-1)
[5](#5)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/lib-intro.tex#L2051)
In Table [36](#tab:cpp17.nullablepointer "Table 36: Cpp17NullablePointer requirements"), u denotes an identifier, t denotes a non-const lvalue of type P, a and b denote values of type (possibly const) P, and np denotes
a value of type (possibly const) std::nullptr_t[.](#5.sentence-1)
Table [36](#tab:cpp17.nullablepointer) — *Cpp17NullablePointer* requirements [[tab:cpp17.nullablepointer]](./tab:cpp17.nullablepointer)
| [🔗](#tab:cpp17.nullablepointer-row-1)<br>**Expression** | **Return type** | **Operational semantics** |
| --- | --- | --- |
| [🔗](#tab:cpp17.nullablepointer-row-2)<br>P u(np); | | *Postconditions*: u == nullptr |
| [🔗](#tab:cpp17.nullablepointer-row-3)<br>P u = np; | | |
| [🔗](#tab:cpp17.nullablepointer-row-4)<br>P(np) | | *Postconditions*: P(np) == nullptr |
| [🔗](#tab:cpp17.nullablepointer-row-5)<br>t = np | P& | *Postconditions*: t == nullptr |
| [🔗](#tab:cpp17.nullablepointer-row-6)<br>a != b | decltype(a != b) models [*boolean-testable*](concept.booleantestable#concept:boolean-testable "18.5.2Boolean testability[concept.booleantestable]") | !(a == b) |
| [🔗](#tab:cpp17.nullablepointer-row-7)<br>a == np | decltype(a == np) and decltype(np == a) each model [*boolean-testable*](concept.booleantestable#concept:boolean-testable "18.5.2Boolean testability[concept.booleantestable]") | a == P() |
| [🔗](#tab:cpp17.nullablepointer-row-8)<br>np == a | | |
| [🔗](#tab:cpp17.nullablepointer-row-9)<br>a != np | decltype(a != np) and decltype(np != a) each model [*boolean-testable*](concept.booleantestable#concept:boolean-testable "18.5.2Boolean testability[concept.booleantestable]") | !(a == np) |
| [🔗](#tab:cpp17.nullablepointer-row-10)<br>np != a | | |