A NullablePointer type is a pointer-like type that supports null values. A type P meets the requirements of NullablePointer if:

P satisfies the requirements of EqualityComparable, DefaultConstructible, CopyConstructible, CopyAssignable, and Destructible,

lvalues of type P are swappable ([swappable.requirements]),

the expressions shown in Table [nullablepointer] are valid and have the indicated semantics, and

P satisfies all the other requirements of this subclause.

A value-initialized object of type P produces the null value of the type.
The null value shall be equivalent only to itself. A default-initialized object
of type P may have an indeterminate value. [ *Note:* Operations involving
indeterminate values may cause undefined behavior. * — end note* ]

An object p of type P can be contextually converted to bool (Clause [conv]). The effect shall be as if p != nullptr had been evaluated in place of p.

No operation which is part of the NullablePointer requirements shall exit via an exception.

In Table [nullablepointer], 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.

Table 25 — NullablePointer requirements

Expression | Return type | Operational semantics |

P u(np); | post: u == nullptr | |

P u = np; | ||

P(np) | post: P(np) == nullptr | |

t = np | P& | post: t == nullptr |

a != b | contextually convertible to bool | !(a == b) |

a == np | contextually convertible to bool | a == P() |

np == a | ||

a != np | contextually convertible to bool | !(a == np) |

np != a |