C++ 具名要求:老式迭代器 (LegacyIterator)
老式迭代器 (LegacyIterator) 要求描述可以用来标识和遍历容器中的元素的类型。
老式迭代器 (LegacyIterator) 是用于其他迭代器类型的基础集合:老式输入迭代器 (LegacyInputIterator) 、老式输出迭代器 (LegacyOutputIterator) 、老式向前迭代器 (LegacyForwardIterator) 、老式双向迭代器 (LegacyBidirectionalIterator) 及老式随机访问迭代器 (LegacyRandomAccessIterator) 。可以把迭代器想象成指针的抽象。
所有类别的迭代器都仅规定了对给定类别可以在(均摊)常量时间内完成的函数。因此,各迭代器的要求表格和概念定义(C++20 起)都没有指定复杂度。
目录 |
[编辑] 要求
若下列条件成立,则类型 It
满足老式迭代器 (LegacyIterator)
- 类型
It
可复制构造 (CopyConstructible) ,且 - 类型
It
可复制赋值 (CopyAssignable) ,且 - 类型
It
可析构 (Destructible) ,且 - 类型
It
可交换 (Swappable) ,且 - std::iterator_traits<It> 拥有成员 typedef
value_type
、(C++20 前)difference_type
、reference
、pointer
和iterator_category
,且 - 给定类型
It
的左值 r,下列表达式必须合法,且拥有其指定的效果:
表达式 | 返回类型 | 前条件 |
---|---|---|
*r | 未指明 | r 可解引用
|
++r | It& | r 可增(表达式 ++r 的行为有定义) |
概念为了定义 std::iterator_traits,定义了以下仅用于阐释的概念。
其中仅用于阐释的概念 __Referenceable<T> 当且仅当 T& 是合法类型时得到满足(特别是 |
(C++20 起) |
[编辑] 注解
术语说明:下标列出本站所用的名字和相应 C++ 标准名字(二者含义相同)。 使用 “Legacy”(和“Cpp17”)前缀是为强调与 C++20 之前标准的兼容性,并区分这些规定和 C++20 引入的新一套迭代器概念。
- ↑ 老式连续迭代器 (LegacyContiguousIterator) 类别在 C++17 才正式提出,但在 C++17 前的代码中,std::vector、std::basic_string、std::array 和 std::valarray 的迭代器,以及指向 C 数组的指针通常都被当做一种独立类别处理。
[编辑] 缺陷报告
下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。
缺陷报告 | 应用于 | 出版时的行为 | 正确行为 |
---|---|---|---|
LWG 2437 | C++98 | *r 必须为 reference
|
对输出迭代器无此要求 |
LWG 3420 | C++20 | 仅用于阐释的概念首先检查 copyable
|
仅若 requires 表达式返回 true 才检查 copyable
|
[编辑] 参阅
(C++20) |
指定该类型对象可以自增且可以解引用 (概念) |
迭代器库 | 提供迭代器的定义、迭代器表征、适配器和工具函数 |