命名空间
变体
操作

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

来自 cppreference.cn
 
 
C++ 命名要求
基本
类型属性
全库范围
NullablePointer(可空指针)
(C++11)
(C++11)




Container(容器)
容器元素
迭代器 (Iterator)
流 I/O
格式化器
随机数
并发
Ranges(范围)
多维视图
其他

 

指定该类型是一个类指针对象,可以与 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

类型和值满足 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++ 标准。

缺陷报告 应用于 发布时的行为 正确的行为
LWG 2114
P2167R3
C++11 上下文可转换为 bool 的要求太弱,未能反映实现者的预期 要求已加强