命名空间
变体
操作

C++ 命名要求: LegacyForwardIterator

来自 cppreference.com
 
 
C++ 命名要求
 

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

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

如果一个 LegacyForwardIterator it 来自一个 Container,则 it 的值类型与容器的相同,因此解引用 (*it) 获取容器的值类型。

内容

[编辑] 要求

类型 定义
X 一个前向迭代器类型
T X值类型(即 std::iterator_traits<X>::value_type)
Ref std::iterator_traits<X>::reference
定义
i, j 类型为 Xconst X 的值
r 类型为 X& 的值

X 满足 LegacyForwardIterator 如果满足以下所有条件

  • X 满足 LegacyInputIterator.
  • X 满足 DefaultConstructible.
  • 如果 X 是一个 可变迭代器RefT 的引用。
  • 如果 X 是一个常量迭代器,Refconst T 的引用。
  • X 类型的对象提供 多遍保证
  • 如果 ij 相等,则要么 ij 都可解引用,要么两者都不可解引用。
  • 如果 ij 都可解引用,则 i == j 当且仅当 *i*j 绑定到同一个对象。
  • 以下表达式必须有效,并具有其指定的效用
 表达式  类型 效用
r++ 可转换为 const X&  等同于 X x = r;
++r;
return x;
.
*i++ Ref

[编辑] 相等域

前向迭代器 == 是迭代器在同一个 底层序列 上的域。

但是,值初始化 的前向迭代器可以比较,并且必须与同一类型的其他值初始化迭代器比较相等。

换句话说,值初始化的前向迭代器表现得好像它们引用同一个空序列的末尾。

(自 C++14)

[编辑] 多遍保证

类型为 X 的两个可解引用迭代器 ab 提供多遍保证,如果满足以下所有条件

  • a == b 意味着 ++a == ++b.
  • 满足以下任一条件
  • X 是一个指针类型。
  • 表达式 (void)++X(a), *a 等同于表达式 *a.

概念

对于 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>>;

    };

其中,仅供说明的概念 __LegacyInputIterator<T>LegacyInputIterator 中进行了描述。

(自 C++20 起)

[edit] 注释

std::forward_iterator 概念不同,LegacyForwardIterator 要求解引用返回引用。

[edit] 缺陷报告

以下行为更改的缺陷报告被追溯应用到先前发布的 C++ 标准中。

DR 应用于 已发布的行为 正确的行为
LWG 1212
N3066
C++98 *i++ 的类型与
*i-- 的类型不匹配,这是 LegacyBidirectionalIterator 所要求的
将类型更改为
Ref
LWG 1311
N3066
C++98 a == b 意味着 ++a == ++b” 这一条
没有提供多遍保证[1]
也要求“a == b
意味着 ++a != b[2]
LWG 3798 C++20 __LegacyForwardIterator 要求
std::iter_reference_t<It> 成为左值引用类型
也允许右值
引用类型
  1. ab 使用相同底层迭代器的场景中,评估表达式 ++a == ++b 实际上会对底层容器进行两次递增,但结果仍然是 true
  2. 正式上也要求暗示 ++b != a

[edit] 另请参阅

指定 input_iterator 是一个支持相等比较和多遍的正向迭代器
(概念) [edit]
迭代器库 提供迭代器、迭代器特性、适配器和实用函数的定义