C++ 命名要求: NullablePointer (C++11 起)
指定类型为可与 std::nullptr_t 对象进行比较的类指针对象。
要求
该类型必须满足以下所有要求:
- EqualityComparable
- DefaultConstructible
- CopyConstructible
- CopyAssignable
- 该类型的左值是 Swappable (C++23 之前)
- Swappable (C++23 起)
- Destructible
此外,类型的值初始化对象必须产生该类型的空值。此空值应仅与其自身等效。类型的默认初始化可能具有不确定值。
该类型的对象必须可上下文转换为 bool
。如果值等效于其空值,则此转换的效果返回 false
,否则返回 true。
此类型执行的任何操作都不能抛出异常。
给定两个类型为 p
和 q
的值,以及 np
是 std::nullptr_t 类型的值(可能带有 const
限定符),该类型必须满足以下附加表达式:
pub | 表达式 | 效果 |
pub | Type p(np); Type p = np; | 此后,p 等效于 nullptr |
pub | Type(np) | 一个等效于 nullptr 的临时对象 |
pub | p = np | 必须返回一个 Type& ,此后,p 等效于 nullptr |
pub | p != q | 必须返回一个可上下文转换为 bool 的值 (C++23 之前)decltype(p != q) 模拟 boolean-testable (C++23 起)效果是 !(p == q) |
pub | p == np np == p | 必须返回一个可上下文转换为 bool 的值 (C++23 之前)decltype(p == np) 和 decltype(np == n) 都模拟 boolean-testable (C++23 起)效果是 (p == Type()) |
pub | p != np np != p | 必须返回一个可上下文转换为 bool 的值 (C++23 之前)decltype(p != np) 和 decltype(np != n) 都模拟 boolean-testable (C++23 起)效果是 !(p == np) |
备注
请注意,NullablePointer 类型不需要解引用(operator*
或 operator->
)。满足这些要求的最小类型是
class handle
{
int id = 0;
public:
handle() = default;
handle(std::nullptr_t) { }
explicit operator bool() const { return id != 0; }
friend bool operator==(handle l, handle r) { return l.id == r.id; }
friend bool operator!=(handle l, handle r) { return !(l == r); }
// or only a defaulted operator== (since C++20)
};
标准库
以下类型必须满足 NullablePointer:
- 每个 Allocator 类型
X
的成员类型X::pointer
、X::const_pointer
、X::void_pointer
和X::const_void_pointer
。 - std::unique_ptr 的成员类型
X::pointer
。 - 类型 std::exception_ptr。