命名空间
变体
操作

C++ 命名需求: LegacyBidirectionalIterator

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

一个 LegacyBidirectionalIterator 是一个 LegacyForwardIterator,它可以双向移动(即增加和减少)。

如果一个 LegacyBidirectionalIterator it 来自一个 Container,那么 itvalue_type 与容器相同,所以解引用 (*it) 获得容器的 value_type

内容

[编辑] 需求

类型 It 满足 LegacyBidirectionalIterator 如果

并且,假设

以下表达式必须有效并且具有指定的含义

表达式 返回值 等效表达式 注释
--a It& 前提条件
  • a 是可递减的(存在这样的 b 使得 a == ++b)

后置条件

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

--a;

return temp;
*a-- reference

一个 可变 LegacyBidirectionalIterator 是一个 LegacyBidirectionalIterator,它还满足 LegacyOutputIterator 需求。

[编辑] 注释

开始迭代器不可递减,如果 --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++ 标准。

DR 应用于 发布的行为 正确行为
LWG 299
(N3066)
C++98 *a-- 的返回值类型
要求可以转换为 T
更改返回值
类型为 reference[1]
LWG 383 C++98 b 要求在 --a 之后可解引用 a 要求可解引用,而不是
LWG 1212
(N3066)
C++98 *a-- 的返回值类型与
*a++ 的返回值类型不匹配,这是 LegacyForwardIterator 所要求的
更改返回值
类型为 reference
  1. 此问题最初由 N2758(迭代器概念)解决,但后来从 C++ 标准中删除了。

[编辑] 参见

指定 forward_iterator 是一个双向迭代器,支持向后移动
(概念) [编辑]
迭代器库 提供迭代器、迭代器特性、适配器和实用函数的定义