C++ 具名要求:老式迭代器 (LegacyIterator)

来自cppreference.com
< cpp‎ | named req
 
 
C++ 具名要求
基础
类型属性
库所属
容器
容器元素
迭代器
流 I/O
随机数
并发
(C++11)
(C++11)
其他
 

老式迭代器 (LegacyIterator) 要求描述可以用来标识和遍历容器中的元素的类型。

老式迭代器 (LegacyIterator) 是用于其他迭代器类型的基础集合:老式输入迭代器 (LegacyInputIterator) 老式输出迭代器 (LegacyOutputIterator) 老式向前迭代器 (LegacyForwardIterator) 老式双向迭代器 (LegacyBidirectionalIterator) 老式随机访问迭代器 (LegacyRandomAccessIterator) 。可以把迭代器想象成指针的抽象。

要求

若下列条件成立,则类型 It 满足老式迭代器 (LegacyIterator)

给定

  • 类型 It 的左值 r

下列表达式必须合法,且拥有其指定的效果:

表达式 返回类型 前条件
*r 未指明 r 可解引用(见下文)
++r It& r 可增(表达式 ++r 的行为有定义)

可解引用的迭代器

表达式 *i 的行为得到定义的迭代器被称作可解引用(dereferenceable)

下列情况下的迭代器不可解引用

  • 它们是末尾后迭代器(包括数组末尾后面一个位置的指针)或起始前迭代器。在特定实现中这些迭代器可能可解引用,但库从不假设它们能。
  • 它们是孤立迭代器,即是说,没有关联到任何序列的迭代器。空指针,以及默认构造的指针(保有不确定的值)是孤立的。
  • 在它们所指代的序列上,它们已经因使迭代器失效的操作之一而失效了。

概念

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

template<class I>

concept __LegacyIterator =
  requires(I i) {
    {   *i } -> __Referenceable;
    {  ++i } -> std::same_as<I&>;
    { *i++ } -> __Referenceable;

  } && std::copyable<I>;

其中仅用于阐释的概念 __Referenceable<T> 当且仅当 T& 是合法类型时得到满足(特别是 T 必须不是 void)。

(C++20 起)

缺陷报告

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

DR 应用于 出版时的行为 正确行为
LWG 3420 C++20 仅用于阐释的概念首先检查 copyable 仅若 requires 表达式返回 true 才检查 copyable

参阅

指定该类型对象可以自增且可以解引用
(概念)
迭代器库 提供迭代器的定义、迭代器表征、适配器及工具函数