跳到主要内容

C++ 命名要求: LegacyForwardIterator

LegacyForwardIterator 是一个可以从指向的元素读取数据的 LegacyIterator

LegacyInputIteratorLegacyOutputIterator 不同,它可以在多趟算法中使用。

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

要求

如果类型 It 满足 LegacyForwardIterator,则:

  • 类型 It 满足 LegacyInputIterator
  • 类型 It 满足 DefaultConstructible
  • 类型 It 的对象提供如下所述多趟保证
  • 设 T 为 It 的值类型。类型 std::iterator_traits<It>::reference 必须是以下之一:
    • T& 或 T&& (自 C++11 起) 如果 It 满足 LegacyOutputIterator (It 是可变的),或者
    • const T& 或 const T&& (自 C++11 起) 否则 (It 是常量),
      (其中 Tstd::iterator_traits<It>::value_type 所表示的类型)
  • 相等和不等比较在同一底层序列的所有迭代器上定义以及值初始化迭代器 (自 C++14 起)

并且,给定

  • i,类型为 It 的可解引用左值
  • reference,由 std::iterator_traits<It>::reference 表示的类型

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

表达式返回类型等价表达式
i++ItIt ip = i; ++i; return ip;
*i++reference

一个可变的 LegacyForwardIterator 是一个除了满足 LegacyOutputIterator 要求之外,还满足这些要求的 LegacyForwardIterator

多趟保证

给定 ab,类型为 It 的可解引用迭代器

  • 如果 ab 比较相等(a == b 在上下文中可转换为 true),那么它们要么都是不可解引用的,要么 *a*b 是绑定到同一对象的引用。
  • 如果 *a*b 指代同一个对象,则 a == b
  • 通过可变 ForwardIterator 进行赋值不会使迭代器失效(由于 reference 被定义为真正的引用而隐含)。
  • 递增 a 的副本不会改变从 a 读取的值(形式上,要么 It 是原始指针类型,要么表达式 (void)++It(a), *a 等价于表达式 *a)。
  • a == b 意味着 ++a == ++b

奇异迭代器 (自 C++14 起)

点击展开

一个值初始化LegacyForwardIterator 的行为类似于某个未指定空容器的末尾迭代器:它与所有相同类型的值初始化的 LegacyForwardIterator 比较相等。

概念 (自 C++20 起)

点击展开

对于 std::iterator_traits 的定义,定义了以下仅用于说明的概念。

template<class It>
concept __LegacyForwardIterator =
__LegacyInputIterator<It> && std::constructible_from<It> &&
std::is_reference_v<std::iter_reference_t<It>> &&
std::same_as<
std::remove_cvref_t<std::iter_reference_t<It>>,
typename std::indirectly_readable_traits<It>::value_type> &&
requires(It it) {
{ it++ } -> std::convertible_to<const It&>;
{ *it++ } -> std::same_as<std::iter_reference_t<It>>;
};

其中,仅用于说明的概念 __LegacyIteratorLegacyIterator#Concept 中描述。

缺陷报告

以下改变行为的缺陷报告已追溯应用于先前发布的 C++ 标准。

DR应用于发布时的行为正确行为
LWG 3798C++20__LegacyForwardIterator 要求 std::iter_reference_t<It> 为左值引用类型也允许右值引用

C++ 命名要求: LegacyForwardIterator

LegacyForwardIterator 是一个可以从指向的元素读取数据的 LegacyIterator

LegacyInputIteratorLegacyOutputIterator 不同,它可以在多趟算法中使用。

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

要求

如果类型 It 满足 LegacyForwardIterator,则:

  • 类型 It 满足 LegacyInputIterator
  • 类型 It 满足 DefaultConstructible
  • 类型 It 的对象提供如下所述多趟保证
  • 设 T 为 It 的值类型。类型 std::iterator_traits<It>::reference 必须是以下之一:
    • T& 或 T&& (自 C++11 起) 如果 It 满足 LegacyOutputIterator (It 是可变的),或者
    • const T& 或 const T&& (自 C++11 起) 否则 (It 是常量),
      (其中 Tstd::iterator_traits<It>::value_type 所表示的类型)
  • 相等和不等比较在同一底层序列的所有迭代器上定义以及值初始化迭代器 (自 C++14 起)

并且,给定

  • i,类型为 It 的可解引用左值
  • reference,由 std::iterator_traits<It>::reference 表示的类型

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

表达式返回类型等价表达式
i++ItIt ip = i; ++i; return ip;
*i++reference

一个可变的 LegacyForwardIterator 是一个除了满足 LegacyOutputIterator 要求之外,还满足这些要求的 LegacyForwardIterator

多趟保证

给定 ab,类型为 It 的可解引用迭代器

  • 如果 ab 比较相等(a == b 在上下文中可转换为 true),那么它们要么都是不可解引用的,要么 *a*b 是绑定到同一对象的引用。
  • 如果 *a*b 指代同一个对象,则 a == b
  • 通过可变 ForwardIterator 进行赋值不会使迭代器失效(由于 reference 被定义为真正的引用而隐含)。
  • 递增 a 的副本不会改变从 a 读取的值(形式上,要么 It 是原始指针类型,要么表达式 (void)++It(a), *a 等价于表达式 *a)。
  • a == b 意味着 ++a == ++b

奇异迭代器 (自 C++14 起)

点击展开

一个值初始化LegacyForwardIterator 的行为类似于某个未指定空容器的末尾迭代器:它与所有相同类型的值初始化的 LegacyForwardIterator 比较相等。

概念 (自 C++20 起)

点击展开

对于 std::iterator_traits 的定义,定义了以下仅用于说明的概念。

template<class It>
concept __LegacyForwardIterator =
__LegacyInputIterator<It> && std::constructible_from<It> &&
std::is_reference_v<std::iter_reference_t<It>> &&
std::same_as<
std::remove_cvref_t<std::iter_reference_t<It>>,
typename std::indirectly_readable_traits<It>::value_type> &&
requires(It it) {
{ it++ } -> std::convertible_to<const It&>;
{ *it++ } -> std::same_as<std::iter_reference_t<It>>;
};

其中,仅用于说明的概念 __LegacyIteratorLegacyIterator#Concept 中描述。

缺陷报告

以下改变行为的缺陷报告已追溯应用于先前发布的 C++ 标准。

DR应用于发布时的行为正确行为
LWG 3798C++20__LegacyForwardIterator 要求 std::iter_reference_t<It> 为左值引用类型也允许右值引用