std::experimental::ranges::SizedSentinel
定义在头文件 <experimental/ranges/iterator> 中 |
||
template< class S, class I > concept bool SizedSentinel = |
(1) | (范围 TS) |
template< class S, class I > constexpr bool disable_sized_sentinel = false; |
(1) | (范围 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 还隐式地要求对该表达式进行额外变体,这些变体接受给定操作数的非常量左值或(可能为常量)右值,除非这种表达式变体明确要求具有不同的语义。这些隐式表达式变体必须满足声明表达式的相同语义要求。实现验证变体语法的程度是不确定的。