C++ 命名要求: NullablePointer (自 C++11 起)
指定该类型是类似指针的对象,可以与 std::nullptr_t 对象进行比较。
目录 |
[[编辑]] 要求
该类型必须满足以下所有要求
此外,该类型的value-initialized对象必须生成该类型的空值。此空值应仅与其自身等效。该类型的默认初始化可能具有不确定的 或错误的(自 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) |
[[编辑]] 注释
请注意,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
为了与标准库组件通信,以下类型必须满足 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 的能力太弱,无法反映实现的预期 | 要求已加强 |