C++ 命名要求: NullablePointer (C++11 起)
指定该类型是一个类指针对象,可以与 std::nullptr_t 对象进行比较。
目录 |
[编辑] 要求
该类型必须满足以下所有要求
- EqualityComparable(可相等比较)
- DefaultConstructible(可默认构造)
- CopyConstructible(可复制构造)
- CopyAssignable(可复制赋值)
- Swappable(可交换)
- Destructible(可析构)
此外,经过值初始化的该类型对象必须产生一个该类型的空值。此空值只能与自身相等。该类型的默认初始化可能会产生不确定或错误(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++ 标准。
缺陷报告 | 应用于 | 发布时的行为 | 正确的行为 |
---|---|---|---|
LWG 2114 (P2167R3) |
C++11 | 上下文可转换为 bool 的要求太弱,未能反映实现者的预期 | 要求已加强 |