命名空间
变体
操作

C++ 命名要求: NullablePointer (自 C++11 起)

来自 cppreference.com
 
 
C++ 命名要求
 

指定该类型为指针类对象,可以与 std::nullptr_t 对象进行比较。

内容

[编辑] 要求

该类型必须满足以下所有要求

此外,该类型的按值初始化对象必须生成该类型的空值。此空值应仅与其自身等效。该类型的默认初始化可能具有 不确定 或错误的(自 C++26 起) 值。

该类型的值必须 上下文可转换为 bool。此转换的效果是在值与空值等效时返回 false,否则返回 true

此类型执行的任何操作都不得抛出异常。

该类型必须满足以下附加表达式,假设有两个类型值为 pq,并且 npstd::nullptr_t 类型的值(可能经过 const 限定)

声明 效果
Type p(np);

Type p = np;

之后,p 等效于 nullptr
表达式 效果
Type(np) 一个与 nullptr 等效的临时对象
p = np 必须返回一个 Type&,并且之后,p 等效于 nullptr
p != q

Type 和值满足 BooleanTestable 要求

(直到 C++20)

decltype(p != q) 模型 布尔可测试

(自 C++20 起)

效果为 !(p == q)

p == np

np == p


两个表达式的 Type 和值满足 BooleanTestable 要求

(直到 C++20)

decltype(p == np)decltype(np == p) 各自模型 布尔可测试

(自 C++20 起)

效果为 (p == Type())

p != np

np != p


两个表达式的 Type 和值满足 BooleanTestable 要求

(直到 C++20)

decltype(p != np)decltype(np != p) 各自模型 布尔可测试

(自 C++20 起)

效果为 !(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::pointerX::const_pointerX::void_pointerX::const_void_pointer
  • std::unique_ptr 的成员类型 pointer
(自 C++23 起)

[编辑] 缺陷报告

以下行为更改缺陷报告已追溯应用于先前发布的 C++ 标准。

DR 应用于 已发布的行为 正确行为
LWG 2114
(P2167R3)
C++11 bool 的上下文可转换性过弱,无法反映实现的预期 强化要求