std::experimental::ranges::SizedSentinel
template< class S, class I > concept bool SizedSentinel = |
(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中使用的每个表达式都必须是等式保持和稳定的,并且表达式的求值可能只会修改其非常量操作数。常量操作数不得修改。
[编辑] 隐式表达式变体
对于某些常量左值操作数是非修改性的表达式,requires-expression 也隐式地要求该表达式的附加变体接受给定操作数的非常量左值或(可能常量)右值,除非明确要求具有不同语义的这种表达式变体。这些隐式表达式变体必须满足声明的表达式的相同语义要求。实现验证变体语法的程度是未指定的。