C++ 命名要求: LegacyForwardIterator
LegacyForwardIterator 是一个可以从指向的元素读取数据的 LegacyIterator。
与 LegacyInputIterator 和 LegacyOutputIterator 不同,它可以在多趟算法中使用。
如果一个 LegacyForwardIterator it
源自一个 Container,那么 it
的 value_type
与容器的相同,因此解引用(*it
)会获得容器的 value_type
。
要求
如果类型 It 满足 LegacyForwardIterator,则:
- 类型 It 满足 LegacyInputIterator
- 类型 It 满足 DefaultConstructible
- 类型 It 的对象提供如下所述的多趟保证
- 设 T 为 It 的值类型。类型
std::iterator_traits<It>::reference
必须是以下之一:- T& 或 T&& (自 C++11 起) 如果 It 满足 LegacyOutputIterator (It 是可变的),或者
- const T& 或 const T&& (自 C++11 起) 否则 (It 是常量),
(其中 T 是std::iterator_traits<It>::value_type
所表示的类型)
- 相等和不等比较在同一底层序列的所有迭代器上定义以及值初始化迭代器 (自 C++14 起)。
并且,给定
i
,类型为 It 的可解引用左值reference
,由std::iterator_traits<It>::reference
表示的类型
以下表达式必须有效并具有其指定的效果
表达式 | 返回类型 | 等价表达式 |
---|---|---|
i++ | It | It ip = i; ++i; return ip; |
*i++ | reference |
一个可变的 LegacyForwardIterator 是一个除了满足 LegacyOutputIterator 要求之外,还满足这些要求的 LegacyForwardIterator。
多趟保证
给定 a
和 b
,类型为 It 的可解引用迭代器
- 如果
a
和b
比较相等(a == b
在上下文中可转换为 true),那么它们要么都是不可解引用的,要么*a
和*b
是绑定到同一对象的引用。 - 如果
*a
和*b
指代同一个对象,则a == b
。 - 通过可变 ForwardIterator 进行赋值不会使迭代器失效(由于
reference
被定义为真正的引用而隐含)。 - 递增
a
的副本不会改变从a
读取的值(形式上,要么 It 是原始指针类型,要么表达式(void)++It(a), *a
等价于表达式*a
)。 a == b
意味着++a == ++b
。
奇异迭代器 (自 C++14 起)
点击展开
一个值初始化的 LegacyForwardIterator 的行为类似于某个未指定空容器的末尾迭代器:它与所有相同类型的值初始化的 LegacyForwardIterator 比较相等。
概念 (自 C++20 起)
点击展开
对于 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>>;
};
其中,仅用于说明的概念 __LegacyIterator
在 LegacyIterator#Concept 中描述。
缺陷报告
以下改变行为的缺陷报告已追溯应用于先前发布的 C++ 标准。
DR | 应用于 | 发布时的行为 | 正确行为 |
---|---|---|---|
LWG 3798 | C++20 | __LegacyForwardIterator 要求 std::iter_reference_t<It> 为左值引用类型 | 也允许右值引用 |