C++ 命名要求: NullablePointer (自 C++11 起)
来自 cppreference.com
指定该类型为指针类对象,可以与 std::nullptr_t 对象进行比较。
内容 |
[编辑] 要求
该类型必须满足以下所有要求
此外,该类型的按值初始化对象必须生成该类型的空值。此空值应仅与其自身等效。该类型的默认初始化可能具有 不确定 或错误的(自 C++26 起) 值。
该类型的值必须 上下文可转换为 bool。此转换的效果是在值与空值等效时返回 false,否则返回 true。
此类型执行的任何操作都不得抛出异常。
该类型必须满足以下附加表达式,假设有两个类型值为 p 和 q,并且 np 是 std::nullptr_t 类型的值(可能经过 const 限定)
声明 | 效果 | ||||
Type p(np);
Type p = np; |
之后,p 等效于 nullptr | ||||
表达式 | 效果 | ||||
Type(np) | 一个与 nullptr 等效的临时对象 | ||||
p = np | 必须返回一个 Type& ,并且之后,p 等效于 nullptr | ||||
p != q |
效果为 !(p == q) | ||||
p == np
np == p |
效果为 (p == Type()) | ||||
p != np
np != p |
效果为 !(p == np) |
[编辑] 注释
请注意,取消引用(operator* 或 operator->)不是 NullablePointer 类型的必需项。满足这些要求的最小类型是
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
为了与标准库组件进行通信,以下类型必须满足 NullablePointer
- 每个 Allocator 类型
X
的成员类型X::pointer
、X::const_pointer
、X::void_pointer
和X::const_void_pointer
。 - std::unique_ptr 的成员类型
pointer
。
|
(自 C++23 起) |
[编辑] 缺陷报告
以下行为更改缺陷报告已追溯应用于先前发布的 C++ 标准。
DR | 应用于 | 已发布的行为 | 正确行为 |
---|---|---|---|
LWG 2114 (P2167R3) |
C++11 | 与 bool 的上下文可转换性过弱,无法反映实现的预期 | 强化要求 |