C++ 具名要求:老式双向迭代器 (LegacyBidirectionalIterator)

来自cppreference.com
< cpp‎ | named req
 
 
C++ 具名要求
基础
类型属性
库所属
容器
容器元素
(C++11)

迭代器
流 I/O
格式化
(C++20)
随机数
(C++11)    
并发
(C++11)
(C++11)
范围
其他
(C++11)


 

老式双向迭代器 (LegacyBidirectionalIterator) 是能双向移动(即自增与自减)的老式向前迭代器 (LegacyForwardIterator)

如果一个老式双向迭代器 (LegacyBidirectionalIterator) it 是从一个容器 (Container) 生成的,那么 itvalue_type 与那个容器的相同,所以解引用(*it)会得到那个容器的 value_type

要求

类型 It 在满足以下所有条件的情况下满足老式双向迭代器 (LegacyBidirectionalIterator)

且,给定

  • ab,类型 It 的迭代器
  • referencestd::iterator_traits<It>::reference 所指代的类型

下列表达式必须合法并拥有对应效果:

表达式 返回 等价表达式 注意
--a It& 前提条件:
  • a 可自减(存在满足 a == ++bb

后条件:

  • a 可解引用
  • --(++a) == a
  • 如果 --a == --b,那么 a == b
  • a--a 指代同一迭代器对象
a-- 可转换到 const It& It temp = a;

--a;

return temp;
*a-- reference

可变(mutable)老式双向迭代器 (LegacyBidirectionalIterator) 是还额外满足老式输出迭代器 (LegacyOutputIterator) 要求的老式双向迭代器 (LegacyBidirectionalIterator)

注解

起始迭代器不可自减。且求值 --container.begin() 的行为未定义。

双向迭代器不必可解引用、可自减(尤其是尾迭代器不可解引用但可自减)。

概念

为了定义 std::iterator_traits,定义了以下仅用于阐释的概念:

template<class I>

concept __LegacyBidirectionalIterator =
    __LegacyForwardIterator<I> && requires(I i)
    {
        {  --i } -> std::same_as<I&>;
        {  i-- } -> std::convertible_to<const I&>;
        { *i-- } -> std::same_as<std::iter_reference_t<I>>;

    };

其中仅用于阐释的概念 __LegacyForwardIteratorLegacyForwardIterator#概念 描述。

(C++20 起)

缺陷报告

下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。

缺陷报告 应用于 出版时的行为 正确行为
LWG 299
(N3066)
C++98 *a-- 的返回类型需要可转换到 T 将返回类型改为 reference[1]
LWG 383 C++98 --ab 需要可解引用 改成 a 需要可解引用
LWG 1212
(N3066)
C++98 *a-- 的返回类型与老式向前迭代器 (LegacyForwardIterator)
要求的 *a++ 的返回类型不匹配
将返回类型改为 reference
  1. 此问题最初由 N2758(迭代器概念)解决,但该提案后来没有进入 C++ 标准。

参阅

指定 forward_iterator 为双向迭代器,支持向后移动
(概念)
迭代器库 提供迭代器的定义、迭代器表征、适配器及工具函数