跳到主要内容

C++ 命名要求: LegacyRandomAccessIterator

一个 LegacyRandomAccessIterator 是一个 LegacyBidirectionalIterator,它可以在常数时间内移动以指向任何元素。

如果一个 LegacyRandomAccessIterator it 源自一个 Container,那么 itvalue_type 与容器的相同,因此解引用 (*it) 会得到容器的 value_type

指向数组元素的指针满足 LegacyRandomAccessIterator 的所有要求。

要求

类型 It 满足 LegacyRandomAccessIterator,如果:

并且,给定

  • 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,类型为 Itconst It 的对象
  • r,类型为 It 的左值
  • n,类型为 difference_type 的整数

以下表达式必须有效并具有其指定的效果

表达式返回类型操作语义备注
r += nIt&difference_type m = n;
if (m >= 0)
while (m--)
++r;
否则
else while (m++)
--r;
return r;
n 可以是正数或负数。复杂度是常数(也就是说,实现不能实际执行操作语义中显示的 while 循环)
a + n n + aItIt temp = a;
return temp += n;
n 可以是正数或负数。a + n == n + a
r -= nIt&return r += -n;n 的绝对值必须在 difference_type 可表示值的范围内。
i - nItIt temp = i;
return temp -= n;
b - adifference_typereturn 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 < bb < ca < c
a < bb < aa == b
(正好有一个表达式为 true
a > b可上下文转换为 boolb < aa < 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++98a[n] 的返回类型要求可转换为 const value_type&返回类型要求可转换为 reference
LWG 448C++98a[n] 的返回类型要求可转换为 value_type返回类型要求可转换为 const value_type& [1]

[1] LWG issue 299 在此决议后重新开放。

C++ 命名要求: LegacyRandomAccessIterator

一个 LegacyRandomAccessIterator 是一个 LegacyBidirectionalIterator,它可以在常数时间内移动以指向任何元素。

如果一个 LegacyRandomAccessIterator it 源自一个 Container,那么 itvalue_type 与容器的相同,因此解引用 (*it) 会得到容器的 value_type

指向数组元素的指针满足 LegacyRandomAccessIterator 的所有要求。

要求

类型 It 满足 LegacyRandomAccessIterator,如果:

并且,给定

  • 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,类型为 Itconst It 的对象
  • r,类型为 It 的左值
  • n,类型为 difference_type 的整数

以下表达式必须有效并具有其指定的效果

表达式返回类型操作语义备注
r += nIt&difference_type m = n;
if (m >= 0)
while (m--)
++r;
否则
else while (m++)
--r;
return r;
n 可以是正数或负数。复杂度是常数(也就是说,实现不能实际执行操作语义中显示的 while 循环)
a + n n + aItIt temp = a;
return temp += n;
n 可以是正数或负数。a + n == n + a
r -= nIt&return r += -n;n 的绝对值必须在 difference_type 可表示值的范围内。
i - nItIt temp = i;
return temp -= n;
b - adifference_typereturn 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 < bb < ca < c
a < bb < aa == b
(正好有一个表达式为 true
a > b可上下文转换为 boolb < aa < 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++98a[n] 的返回类型要求可转换为 const value_type&返回类型要求可转换为 reference
LWG 448C++98a[n] 的返回类型要求可转换为 value_type返回类型要求可转换为 const value_type& [1]

[1] LWG issue 299 在此决议后重新开放。