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) | 指定该类型对象可以自增且可以解引用 (概念) |
迭代器库 | 提供迭代器的定义、迭代器表征、适配器和工具函数 |