Namespaces
Variants

C++ named requirements: NullablePointer (since C++11)

From cppreference.net
C++ named requirements

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

目录

要求

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

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

类型和值满足 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); }
    // 或仅使用默认的 operator==(自 C++20 起)
};

标准库

以下类型满足 NullablePointer 要求:

以下类型必须满足 NullablePointer 要求才能与标准库组件进行交互:

  • 每个 Allocator 类型 X 的成员类型 X::pointer X::const_pointer X::void_pointer X::const_void_pointer
  • std::unique_ptr 的成员类型 pointer
(since C++23)

缺陷报告

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

缺陷报告 应用于 发布时的行为 正确行为
LWG 2114
( P2167R3 )
C++11 上下文转换为 bool 的要求过于宽松,未能反映实现方案的预期 强化了相关要求