C++ 具名要求:老式向前迭代器 (LegacyForwardIterator)
出自cppreference.com
老式向前迭代器 (LegacyForwardIterator) 是能從所指向的元素讀取數據的老式迭代器 (LegacyIterator) 。
與老式輸入迭代器 (LegacyInputIterator) 和老式輸出迭代器 (LegacyOutputIterator) 不同,它可被用於多趟算法。
如果某個老式向前迭代器 (LegacyForwardIterator) it 源自某個容器 (Container) ,那麼 it 與該容器具有相同的值類型,因此解引用 (*it) 將獲得該容器的值類型。
要求
| 類型 | 定義 |
X
|
向前迭代器類型 |
T
|
X 的值類型(即 std::iterator_traits<X>::value_type)
|
Ref
|
std::iterator_traits<X>::reference
|
| 值 | 定義 |
i, j
|
X 或 const X 類型的值
|
r
|
X& 類型的值
|
在滿足以下所有條件時,X 是老式向前迭代器 (LegacyForwardIterator) :
X滿足老式輸入迭代器 (LegacyInputIterator) .X滿足可默認構造 (DefaultConstructible) .- 如果
X是可變迭代器,那麼Ref是到T的引用。 - 如果
X是常迭代器,那麼Ref是到const T的引用。 X類型的對象提供多趟保證。- 如果
i與j相等,那麼i和j要麼都可解引用,要麼都不可解引用。 - 如果
i和j都可解引用,那麼當且僅當*i和*j都綁定到相同的對象時i == j。 - 下列表達式必須合法,並且具有指定的效果:
| 表達式 | 類型 | 效果 |
|---|---|---|
r++
|
可轉換到 const X&
|
等價於 X x = r;++r;return x;。
|
*i++
|
Ref
|
相等性定義域
對於向前迭代器,== 的定義域是具有相同的底層序列的迭代器。
|
值初始化的向前迭代器也可以用來比較,而且必須與相同類型的其他值初始化的迭代器比較相等。 也就是說,值初始化的向前迭代器如同是指代相同的空序列的尾後位置的迭代器。 |
(C++14 起) |
多趟保證
X 類型的兩個可解引用的迭代器 a 和 b 在滿足以下所有條件時提供多趟保證:
a == b意味着++a == ++b。- 滿足以下任意條件:
X是指針類型。- 表達式
(void)++X(a), *a等價於表達式*a。
概念為了定義 std::iterator_traits,定義了以下僅用於闡述的概念:
其中僅用於闡述的概念 |
(C++20 起) |
註解
與 std::forward_iterator 概念不同,老式向前迭代器 (LegacyForwardIterator) 要求解引用需要返回引用。
缺陷報告
下列更改行為的缺陷報告追溯地應用於以前出版的 C++ 標準。
| 缺陷報告 | 應用於 | 出版時的行為 | 正確行為 |
|---|---|---|---|
| LWG 1212 (N3066) |
C++98 | *i++ 的類型與老式雙向迭代器 (LegacyBidirectionalIterator) 要求的 *i-- 的類型不匹配
|
將類型改為 Ref
|
| LWG 1311 (N3066) |
C++98 | 「a == b 意味着 ++a == ++b」不足以提供多趟保證[1]
|
也要求「a == b 意味着 ++a != b」[2]
|
| LWG 3798 | C++20 | __LegacyForwardIterator 要求std::iter_reference_t<It> 是左值引用類型
|
也允許右值引用類型 |
參閱
(C++20) |
指定 input_iterator 為向前迭代器,支持相等比較與多趟操作 (概念) |
| 迭代器庫 | 提供迭代器的定義、迭代器表徵、適配器和工具函數 |