std:: contiguous_iterator
|
定义于头文件
<iterator>
|
||
|
template
<
class
I
>
concept contiguous_iterator
=
|
(C++20 起) | |
contiguous_iterator
概念通过保证所指示的元素在内存中连续存储,对
random_access_iterator
进行了细化。
|
给定一个满足
这意味着程序不能依赖解引用、递增或递减连续迭代器 i 产生的任何副作用,因为标准库函数可能通过 std:: to_address ( i ) 获取指针进行操作,而非直接操作 i 。 |
(since C++26) |
目录 |
迭代器概念判定
此概念的定义通过仅用于阐述的别名模板 /*ITER_CONCEPT*/ 进行规范。
为确定 /*ITER_CONCEPT*/ < I > ,令 ITER_TRAITS < I > 表示:当特化 std:: iterator_traits < I > 由主模板生成时为 I ,否则为 std:: iterator_traits < I > :
- 若 ITER_TRAITS < I > :: iterator_concept 有效且指名一个类型,则 /*ITER_CONCEPT*/ < I > 表示该类型。
- 否则,若 ITER_TRAITS < I > :: iterator_category 有效且指名一个类型,则 /*ITER_CONCEPT*/ < I > 表示该类型。
-
否则,若
std::
iterator_traits
<
I
>
由主模板生成,则
/*ITER_CONCEPT*/
<
I
>
表示
std::random_access_iterator_tag
。
(即假定 std:: derived_from < /*ITER_CONCEPT*/ < I > , std:: contiguous_iterator_tag > 为 false 。) - 否则, /*ITER_CONCEPT*/ < I > 不表示任何类型并导致替换失败。
语义要求
设
a
和
b
为
可解引用
迭代器,
c
为类型
I
的不可解引用迭代器,且满足
b
可从
a
抵达
,
c
可从
b
抵达,则类型
I
满足
contiguous_iterator
概念当且仅当其包含的所有概念均被满足且符合以下全部条件:
- std:: to_address ( a ) == std:: addressof ( * a ) 。
- std:: to_address ( b ) == std:: to_address ( a ) + std:: iter_difference_t < I > ( b - a ) 。
- std:: to_address ( c ) == std:: to_address ( a ) + std:: iter_difference_t < I > ( c - a ) 。
- std:: to_address ( I { } ) 是良定义的。
- ranges:: iter_move ( a ) 具有与 std :: move ( * a ) 相同的类型、值类别和效果。
- 若 ranges:: iter_swap ( a, b ) 是良构的,则其效果等价于 ranges:: swap ( * a, * b ) 。
等值保持性
标准库概念的 requires 表达式 中声明的表达式必须满足 等值保持 特性(除非另有说明)。
隐式表达式变体
对于某个常量左值操作数使用非修改表达式的 requires 表达式 同样需要 隐式表达式变体 。
注释
contiguous_iterator
由每个指向完整对象类型的指针类型所建模。
标准库中要求满足 C++17
LegacyContiguousIterator
要求的迭代器类型,在 C++20 中也必须满足
contiguous_iterator
概念模型。
缺陷报告
以下行为变更缺陷报告被追溯应用于先前发布的C++标准。
| 缺陷报告 | 适用标准 | 发布时行为 | 正确行为 |
|---|---|---|---|
| LWG 3607 | C++20 |
contiguous_iterator
可能具有自定义的
ranges::iter_move 和 ranges::iter_swap 行为 |
禁止 |
| LWG 4170 | C++20 |
值初始化的
contiguous_iterator
对
可能无法表示空范围 |
保证 |
参见
|
(C++20)
|
指定
bidirectional_iterator
为随机访问迭代器,支持常数时间内的前进后退操作及下标访问
(概念) |