Namespaces
Variants

std::experimental::ranges:: SizedSentinel

From cppreference.net
template < class S, class I >

concept bool SizedSentinel =
Sentinel < S, I > &&
! ranges :: disable_sized_sentinel < std:: remove_cv_t < S > , std:: remove_cv_t < I >> &&
requires ( const I & i, const S & s ) {
{ s - i } - > Same < ranges :: difference_type_t < I >> && ;
{ i - s } - > Same < ranges :: difference_type_t < I >> && ;

} ;
(1) (ranges TS)
template < class S, class I >
constexpr bool disable_sized_sentinel = false ;
(1) (ranges TS)

SizedSentinel 概念规定了迭代器类型 I 的对象与哨兵类型 S 的对象可以通过相减运算在常数时间内计算出两者间的距离。

i 为类型 I 的迭代器, s 为类型 S 的哨位,使得 [ i , s ) 表示一个范围。设 N 为使 bool ( i == s ) 成立所需应用 ++i 的最小次数。则仅当满足以下条件时 SizedSentinel<S, I> 成立:

  • N 可由 ranges :: difference_type_t < I > 表示,则 s - i 是良定义的且等于 N ;且
  • -N 可由 ranges :: difference_type_t < I > 表示,则 i - s 是良定义的且等于 -N

变量模板 disable_sized_sentinel 为可进行减法运算但不符合 SizedSentinel 语义要求的迭代器和哨位提供了一种机制,通过特化该变量模板使其值为 true 来退出该概念。

等值保持性

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

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

每个要求保持相等性的表达式还必须满足 稳定性 要求:对此类表达式进行两次求值时,若输入对象相同且未进行任何显式修改,则必须产生相等的输出结果。

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

隐式表达式变体

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