C++ 命名要求: LegacyRandomAccessIterator
一个 LegacyRandomAccessIterator 是一个 LegacyBidirectionalIterator,它可以在常数时间内移动以指向任何元素。
如果一个 LegacyRandomAccessIterator it
源自一个 Container,那么 it
的 value_type
与容器的相同,因此解引用 (*it
) 会得到容器的 value_type
。
指向数组元素的指针满足 LegacyRandomAccessIterator 的所有要求。
要求
类型 It 满足 LegacyRandomAccessIterator,如果:
- 类型 It 满足 LegacyBidirectionalIterator
并且,给定
value_type
,由std::iterator_traits<It>::value_type
表示的类型difference_type
,由std::iterator_traits<It>::difference_type
表示的类型reference
,由std::iterator_traits<It>::reference
表示的类型i
,a
,b
,类型为 It 或 const It 的对象r
,类型为 It 的左值n
,类型为 difference_type 的整数
以下表达式必须有效并具有其指定的效果
表达式 | 返回类型 | 操作语义 | 备注 |
---|---|---|---|
r += n | It& | difference_type m = n; | n 可以是正数或负数。复杂度是常数(也就是说,实现不能实际执行操作语义中显示的 while 循环) |
a + n n + a | It | It temp = a; | n 可以是正数或负数。a + n == n + a |
r -= n | It& | return r += -n; | n 的绝对值必须在 difference_type 可表示值的范围内。 |
i - n | It | It temp = i; | |
b - a | difference_type | return n; | 前置条件:存在一个 difference_type 类型的 n 值,使得 a + n == b 后置条件: b == a + (b - a) 。 |
i[n] | 可转换为 reference | *(i + n) | |
a < b | 可上下文转换为 bool | 等价于 return b - a > 0; | 前置条件:与 b - a 相同严格全序关系: !(a < a) 如果 a < b 则 !(b < a) 如果 a < b 且 b < c 则 a < c a < b 或 b < a 或 a == b (正好有一个表达式为 true) |
a > b | 可上下文转换为 bool | b < a | 与 a < b 相反的全序关系 |
a >= b | 可上下文转换为 bool | !(a < b) | |
a <= b | 可上下文转换为 bool | !(a > b) |
上述规则意味着 LegacyRandomAccessIterator 也实现了 LessThanComparable。
一个可变的 LegacyRandomAccessIterator 是一个额外满足 LegacyOutputIterator 要求的 LegacyRandomAccessIterator。
概念 (自 C++20 起)
点击展开
对于 std::iterator_traits 的定义,定义了以下仅用于说明的概念。
template<class I>
concept __LegacyRandomAccessIterator =
__LegacyBidirectionalIterator<I> && std::totally_ordered<I> &&
requires(I i, typename std::incrementable_traits<I>::difference_type n)
{
{ i += n } -> std::same_as<I&>;
{ i -= n } -> std::same_as<I&>;
{ i + n } -> std::same_as<I>;
{ n + i } -> std::same_as<I>;
{ i - n } -> std::same_as<I>;
{ i - i } -> std::same_as<decltype(n)>;
{ i[n] } -> std::convertible_to<std::iter_reference_t<I>>;
};
其中仅用于说明的概念 __LegacyBidirectionalIterator
在 LegacyIterator#Concept 中描述。
缺陷报告
以下改变行为的缺陷报告已追溯应用于先前发布的 C++ 标准。
DR | 应用于 | 发布时的行为 | 正确行为 |
---|---|---|---|
LWG 299 (N3066) | C++98 | a[n] 的返回类型要求可转换为 const value_type& | 返回类型要求可转换为 reference |
LWG 448 | C++98 | a[n] 的返回类型要求可转换为 value_type | 返回类型要求可转换为 const value_type& [1] |
↑ [1] LWG issue 299 在此决议后重新开放。