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
          为随机访问迭代器,支持常数时间内的前进后退操作及下标访问(概念) |