命名空间
变体
操作

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

来自 cppreference.cn
< cpp‎ | named req
 
 
C++ 命名要求
随机数
(C++11)
并发
(C++11)
(C++11)
(C++11)
(C++14)
(C++11)
(C++11)
(C++17)
(C++14)
范围
多维视图
(C++23)
(C++23)
其他
(C++11)
(C++11)
(C++11)
(C++11)

 

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

目录

[[编辑]] 要求

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

此外,该类型的value-initialized对象必须生成该类型的空值。此空值应仅与其自身等效。该类型的默认初始化可能具有不确定的 或错误的(自 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

类型和值满足 BooleanTestable 要求

(直到 C++20)

decltype(p != q) 模型 boolean-testable

(自 C++20 起)

效果是 !(p == q)

p == np

np == p


两个表达式的类型和值都满足 BooleanTestable 要求

(直到 C++20)

decltype(p == np)decltype(np == p) 各自模型 boolean-testable

(自 C++20 起)

效果是 (p == Type())

p != np

np != p


两个表达式的类型和值都满足 BooleanTestable 要求

(直到 C++20)

decltype(p != np)decltype(np != p) 各自模型 boolean-testable

(自 C++20 起)

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

[[编辑]] 缺陷报告

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

DR 应用于 已发布行为 正确行为
LWG 2114
P2167R3
C++11 上下文转换为 bool 的能力太弱,无法反映实现的预期 要求已加强