C++ 具名要求:老式向前迭代器 (LegacyForwardIterator)

出自cppreference.com


 
 
C++ 具名要求
 

老式向前迭代器 (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 Xconst X 類型的值
r X& 類型的值

在滿足以下所有條件時,X老式向前迭代器 (LegacyForwardIterator)

 表達式  類型 效果
r++ 可轉換到 const X&  等價於 X x = r;
++r;
return x;
*i++ Ref

相等性定義域

對於向前迭代器,==定義域是具有相同的底層序列的迭代器。

值初始化的向前迭代器也可以用來比較,而且必須與相同類型的其他值初始化的迭代器比較相等。

也就是說,值初始化的向前迭代器如同是指代相同的空序列的尾後位置的迭代器。

(C++14 起)

多趟保證

X 類型的兩個可解引用的迭代器 ab 在滿足以下所有條件時提供多趟保證

  • a == b 意味著 ++a == ++b
  • 滿足以下任意條件:
  • X 是指針類型。
  • 表達式 (void)++X(a), *a 等價於表達式 *a


概念

為了定義 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>>;
    };

其中僅用於闡述的概念 __LegacyInputIterator<T> 描述於 LegacyInputIterator

(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> 是左值引用類型
也允許右值引用類型
  1. 例如在 ab 使用相同的底層迭代器的情況下,對表達式 ++a == ++b 進行求值會將底層迭代器自增兩次,但求值結果依然是 true
  2. 正式而言也要求蘊含 ++b != a

參閱

指定 input_iterator 為向前迭代器,支持相等比較與多趟操作
(概念) [編輯]
迭代器庫 提供迭代器的定義、迭代器表徵、適配器和工具函數