std:: basic_const_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
>
( 仅用于说明的成员类型* ) |
成员对象
| 成员名称 | 定义 |
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; // 正确:v[0] 现在等于 4 i[1] = 4; // 正确:等同于 *(i + 1) = 4 auto ci = std::make_const_iterator(i); assert(*ci == 4); // 正确:可以读取底层对象 assert(ci[0] == 4); // 正确:同上 // *ci = 13; // 错误:该位置为只读 // ci[0] = 13; // 错误:同上 ci.base()[0] = 42; // 正确:底层迭代器可写入 assert(*ci == 42); // 正确:底层位置 v[0] 已被修改 }
缺陷报告
以下行为变更缺陷报告被追溯应用于先前发布的C++标准。
| 缺陷报告 | 应用于 | 发布时行为 | 正确行为 |
|---|---|---|---|
| P2836R1 | C++23 |
basic_const_iterator
未遵循其底层类型的可转换性
|
提供转换运算符 |