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> |
引用 (私有) |
std::iter_const_reference_t<Iter> (仅供说明的成员类型*) |
[编辑] 成员对象
成员名称 | 定义 |
当前 (私有) |
底层迭代器,base() 从中复制或移动(仅供说明的成员对象*) |
[编辑] 成员函数
构造一个新的迭代器适配器 (公共成员函数) | |
访问底层迭代器 (公共成员函数) | |
访问指向的元素 (公共成员函数) | |
通过索引访问元素 (公共成员函数) | |
推进或递减迭代器 (公共成员函数) | |
转换为底层迭代器可以转换为的任何常量迭代器 (公有成员函数) | |
比较底层迭代器 (公有成员函数) |
[编辑] 非成员函数
比较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 起) | |
[编辑] 注释
特性测试 宏 | 值 | Std | 特性 |
---|---|---|---|
__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++ 标准。
DR | 应用于 | 已发布的行为 | 正确行为 |
---|---|---|---|
P2836R1 | C++23 | basic_const_iterator 不遵循其底层类型的可转换性 |
提供转换运算符 |