Namespaces
Variants

std::experimental::ranges:: RandomAccessIterator

From cppreference.net
template < class I >

concept bool RandomAccessIterator =
BidirectionalIterator < I > &&
DerivedFrom < ranges :: iterator_category_t < I > , ranges :: random_access_iterator_tag > &&
StrictTotallyOrdered < I > &&
SizedSentinel < I, I > &&
requires ( I i, const I j, const ranges :: difference_type_t < I > n ) {
{ i + = n } - > Same < I > & ;
{ j + n } - > Same < I > && ;
{ n + j } - > Same < I > && ;
{ i - = n } - > Same < I > & ;
{ j - n } - > Same < I > && ;
j [ n ] ;
requires Same < decltype ( j [ n ] ) , ranges :: reference_t < I >> ;

} ;
(ranges TS)

概念 RandomAccessIterator<I> BidirectionalIterator 的基础上进行扩展,增加了通过 += + -= - 运算符实现常数时间前进/后退的支持,通过 - 运算符实现常数时间距离计算,以及通过下标访问实现数组表示法。

a b 是类型为 I 的有效迭代器,且 b 可从 a 抵达,并设 n 为类型 ranges :: difference_type_t < I > 的值,其等于 b - a 。仅当满足以下条件时, RandomAccessIterator<I> 才被满足:

  • ( a + = n ) 等于 b
  • std:: addressof ( a + = n ) 等于 std:: addressof ( a )
  • ( a + n ) 等于 ( a + = n )
  • ( a + n ) 等于 ( n + a )
  • 对于任意两个正整数 x y ,若 a + ( x + y ) 有效,则 a + ( x + y ) 等于 ( a + x ) + y
  • a + 0 等于 a
  • ( a + ( n - 1 ) ) 有效,则 -- b 等于 ( a + ( n - 1 ) )
  • ( b + = - n ) ( b - = n ) 均等于 a
  • std:: addressof ( b - = n ) 等于 std:: addressof ( b )
  • ( b - n ) 等于 ( b - = n )
  • b 可解引用,则 a [ n ] 有效且等于 * b
  • bool ( a <= b ) true

相等性保持

表达式若在给定相等输入时产生相等输出,则称其具有 等值保持性

  • 表达式的输入由其操作数构成。
  • 表达式的输出由其结果及所有被该表达式修改的操作数(如有)构成。

所有要求保持相等性的表达式必须进一步满足 稳定性 要求:对此类表达式进行两次求值时,若输入对象相同且期间未显式修改这些输入对象,则必须产生相等的输出结果。

除非另有说明,在 要求表达式 中使用的每个表达式都必须保持相等性且稳定,且表达式的求值只能修改其非常量操作数。常量操作数不得被修改。

隐式表达式变体

一个使用对某个常量左值操作数进行非修改性表达式的 requires表达式 ,会隐式要求该表达式接受非常量左值或(可能为常量的)右值作为给定操作数的附加变体,除非已通过具有不同语义的显式要求指定了此类表达式变体。这些 隐式表达式变体 必须满足声明表达式的相同语义要求。实现对这些变体语法验证的程度未作明确规定。