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

来自cppreference.com
< cpp‎ | named req


 
 
C++ 具名要求
 

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

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

所有类别的迭代器都仅规定了对给定类别可以在(均摊)常量时间内完成的函数。因此,各迭代器的要求表格和概念定义(C++20 起)都没有指定复杂度。

目录

[编辑]要求

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

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

概念

为了定义 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++ 标准名字(二者含义相同)。 使用 “Legacy”(和“Cpp17”)前缀是为强调与 C++20 之前标准的兼容性,并区分这些规定和 C++20 引入的新一套迭代器概念

cppreference 名字 C++ 标准名字 C++20 迭代器概念
老式迭代器(LegacyIterator) Cpp17Iteratorinput_or_output_iterator
老式输入迭代器(LegacyInputIterator) Cpp17InputIteratorinput_iterator
老式输出迭代器(LegacyOutputIterator) Cpp17OutputIteratoroutput_iterator
老式向前迭代器(LegacyForwardIterator) Cpp17ForwardIteratorforward_iterator
老式双向迭代器(LegacyBidirectionalIterator) Cpp17BidirectionalIteratorbidirectional_iterator
老式随机访问迭代器(LegacyRandomAccessIterator) Cpp17RandomAccessIteratorrandom_access_iterator
老式连续迭代器(LegacyContiguousIterator) [1]contiguous_iterator
  1. 老式连续迭代器(LegacyContiguousIterator) 类别在 C++17 才正式提出,但在 C++17 前的代码中,std::vectorstd::basic_stringstd::arraystd::valarray 的迭代器,以及指向 C 数组的指针通常都被当做一种独立类别处理。

[编辑]缺陷报告

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

缺陷报告 应用于 出版时的行为 正确行为
LWG 2437 C++98 *r 必须为 reference 对输出迭代器无此要求
LWG 3420 C++20 仅用于阐释的概念首先检查 copyable 仅若 requires 表达式返回 true 才检查 copyable

[编辑]参阅

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