Namespaces
Variants

std:: basic_const_iterator

From cppreference.net
Iterator library
Iterator concepts
Iterator primitives
Algorithm concepts and utilities
Indirect callable concepts
Common algorithm requirements
(C++20)
(C++20)
(C++20)
Utilities
(C++20)
Iterator adaptors
basic_const_iterator
(C++23)
const_iterator
(C++23)
const_sentinel
(C++23)
make_const_iterator
(C++23)
make_const_sentinel
(C++23)

Range access
(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 >
仅用于说明的成员类型*

成员对象

成员名称 定义
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;   // 正确,现在 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 未遵循其底层类型的可转换性 提供转换运算符