std::basic_const_iterator
来自cppreference.com
在标头 <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 (private) | std::iter_const_reference_t<Iter> (仅用于阐述的成员类型*) |
[编辑]成员对象
成员名 | 定义 |
current (private) | base() 从中复制或移动的底层迭代器(仅用于阐述的成员对象*) |
[编辑]成员函数
构造新的 basic_const_iterator (公开成员函数) | |
访问底层迭代器 (公开成员函数) | |
访问被指向的元素 (公开成员函数) | |
按索引访问元素 (公开成员函数) | |
推进或减少迭代器 (公开成员函数) | |
转换到底层类型可转换到的常量迭代器 (公开成员函数) | |
比较底层迭代器 (公开成员函数) |
[编辑]非成员函数
比较 basic_const_iterator 和非 basic_const_iterator (函数模板) | |
(C++23) | 推进或减少迭代器 (函数模板) |
计算两个迭代器适配器间的距离 (函数模板) | |
(C++20) | 将解引用底层迭代器的结果转换为其关联的右值引用类型 (函数) |
[编辑]辅助类
确定迭代器和所适配的 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 i[1]=4;// OK,与 *(i + 1) = 4; 相同 auto ci =std::make_const_iterator(i);assert(*ci ==4);// OK,可以读取底层对象assert(ci[0]==4);// OK,同上// *ci = 13; // 错误:该位置只读// ci[0] = 13; // 错误:同上 ci.base()[0]=42;// OK,底层迭代器可写assert(*ci ==42);// OK,修改了底层位置 v[0]}
[编辑]缺陷报告
下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。
缺陷报告 | 应用于 | 出版时的行为 | 正确行为 |
---|---|---|---|
P2836R1 | C++23 | basic_const_iterator 不遵循其底层类型的可转换性 | 提供转换运算符 |