std::basic_const_iterator
來自 cppreference.com
< cpp | 迭代器 (iterator)
定義於標頭檔案 <iterator> |
||
template< std::input_iterator Iter > class basic_const_iterator; |
(C++23 起) | |
std::basic_const_iterator
是一個迭代器介面卡,其行為與底層迭代器完全相同(底層迭代器必須至少是 LegacyInputIterator 或模型 input_iterator
),但解引用會將底層迭代器返回的值轉換為不可變。std::basic_const_iterator
的特化是常量迭代器,也就是說,該迭代器永遠不能用作輸出迭代器,因為不允許修改元素。
目錄 |
[編輯] 成員型別
成員型別 | 定義 |
iterator_category (有條件存在) |
如果
否則,沒有成員 |
iterator_concept
|
|
value_type
|
std::iter_value_t<Iter> |
difference_type
|
std::iter_difference_t<Iter> |
reference (私有) |
std::iter_const_reference_t<Iter> (僅供說明的成員型別*) |
[編輯] 成員物件
成員名稱 (Member name) | 定義 |
current (私有) |
底層迭代器,base() 從中複製或移動(僅用於闡釋的成員物件*) |
[編輯] 成員函式
構造一個新的 basic_const_iterator (公共成員函式) | |
訪問底層迭代器 (公共成員函式) | |
訪問指向的元素 (公共成員函式) | |
透過索引訪問元素 (公共成員函式) | |
推進或遞減迭代器 (公共成員函式) | |
轉換為任何常量迭代器,底層迭代器可以轉換為該常量迭代器 (公共成員函式) | |
比較底層迭代器 (公共成員函式) |
[編輯] 非成員函式
比較 basic_const_iterator 與非 basic_const_iterator (函式模板) | |
(C++23) |
推進或遞減迭代器 (函式模板) |
(C++23) |
計算兩個迭代器介面卡之間的距離 (函式模板) |
(C++23) |
將底層迭代器解引用的結果轉換為其關聯的右值引用型別 (函式) |
[編輯] 輔助類
確定迭代器和適配的 basic_const_iterator 型別的公共型別(類模板特化) |
[編輯] 輔助別名模板
template< std::input_iterator I > using const_iterator = /* 參見描述 */; |
(C++23 起) | |
如果 I
模型為 constant-iterator
(一個僅用於說明的概念),則 const_iterator<I> 表示型別 I
。否則為 basic_const_iterator<I>。
template< std::semiregular S > using const_sentinel = /* 參見描述 */; |
(C++23 起) | |
如果 S
模型為 input_iterator
,則 const_sentinel<S> 表示型別 const_iterator<S>。否則為 S
。
[編輯] 輔助函式模板
template< std::input_iterator T > constexpr const_iterator<T> make_const_iterator( I it ) { return it; } |
(C++23 起) | |
template< std::semiregular S > constexpr const_sentinel<S> make_const_sentinel( S s ) { return s; } |
(C++23 起) | |
[編輯] 注意
特性測試宏 | 值 | 標準 | 特性 |
---|---|---|---|
__cpp_lib_ranges_as_const |
202207L |
(C++23) | std::basic_const_iterator
|
202311L |
(C++23) (DR) |
std::basic_const_iterator 應該遵循其底層型別的可轉換性 |
[編輯] 示例
執行此程式碼
#include <cassert> #include <iterator> #include <vector> int main() { std::vector v{1, 2, 3}; std::vector<int>::iterator i = v.begin(); *i = 4; // OK, v[0] == 4 now i[1] = 4; // OK, the same as *(i + 1) = 4; auto ci = std::make_const_iterator(i); assert(*ci == 4); // OK, can read the underlying object assert(ci[0] == 4); // OK, ditto // *ci = 13; // Error: location is read-only // ci[0] = 13; // Error: ditto ci.base()[0] = 42; // OK, underlying iterator is writable assert(*ci == 42); // OK, underlying location v[0] was modified }
[編輯] 缺陷報告
下列更改行為的缺陷報告追溯地應用於以前出版的 C++ 標準。
缺陷報告 | 應用於 | 釋出時的行為 | 正確的行為 |
---|---|---|---|
P2836R1 | C++23 | basic_const_iterator 不遵循其底層型別的可轉換性 |
提供轉換運算子 |