std::basic_const_iterator

来自cppreference.com
< cpp‎ | iterator
 
 
迭代器库
迭代器概念
迭代器原语
算法概念与工具
间接可调用概念
常用算法要求
(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_typestd::iter_value_t<Iter>
difference_typestd::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++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_const202207L(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 不遵循其底层类型的可转换性 提供转换运算符
close