名稱空間
變體
操作

std::basic_const_iterator

來自 cppreference.com
 
 
迭代器庫
迭代器概念
迭代器原語
演算法概念與工具
間接可呼叫概念
常用演算法要求
(C++20)
(C++20)
(C++20)
工具
(C++20)
迭代器介面卡
basic_const_iterator
(C++23)
const_iterator
(C++23)
const_sentinel
(C++23)
make_const_iterator
(C++23)
make_const_sentinel
(C++23)

範圍訪問
(C++11)(C++14)
(C++14)(C++14)  
(C++11)(C++14)
(C++14)(C++14)  
(C++17)(C++20)
(C++17)
(C++17)
 
 
定義於標頭檔案 <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
(有條件存在)

如果 Iter 模型為 forward_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)
將底層迭代器解引用的結果轉換為其關聯的右值引用型別
(函式) [編輯]

[編輯] 輔助類

確定迭代器和適配的 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 不遵循其底層型別的可轉換性 提供轉換運算子