命名空间
变体
操作

C++ 命名要求: LegacyForwardIterator

来自 cppreference.cn
< cpp‎ | named req
 
 
C++ 命名要求
基本
类型属性
库范围




容器 (Container)
容器元素
迭代器 (Iterator)
遗留前向迭代器 (LegacyForwardIterator)
流 I/O
格式化器 (Formatters)
随机数
并发
范围 (Ranges)
多维视图
其他

 

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

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

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

内容

[编辑] 要求

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

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

  • X 满足 LegacyInputIterator
  • X 满足 DefaultConstructible
  • 如果 X 是一个可变迭代器,则 Ref 是对 T 的引用。
  • 如果 X 是一个常量迭代器,则 Ref 是对 const 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 起)

[编辑] 注解

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

[编辑] 缺陷报告

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

DR 应用于 已发布行为 正确行为
LWG 1212
(N3066)
C++98 *i++ 的类型与
*i--LegacyBidirectionalIterator 要求)的类型不匹配
将类型更改为 Ref
类型更改为 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

[编辑] 参见

指定 input_iterator 是前向迭代器,支持相等比较和多趟
(概念) [编辑]
迭代器库 提供迭代器、迭代器特征、适配器和实用函数的定义