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.
|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|