std::experimental::ranges::EqualityComparable, std::experimental::ranges::EqualityComparableWith
来自 cppreference.com
< cpp | experimental | ranges
定义在头文件 <experimental/ranges/concepts> 中 |
||
template< class T > concept bool EqualityComparable = WeaklyEqualityComparableWith<T, T>; |
(1) | (范围 TS) |
template< class T, class U > concept bool EqualityComparableWith = |
(2) | (范围 TS) |
1) 概念
EqualityComparable<T>
指定在 T
上的比较运算符 ==
和 !=
反映相等性:==
产生 true 当且仅当操作数相等。EqualityComparable<T>
仅在以下情况下满足:给定类型 T
的对象 a
和 b
,bool(a == b) 为 true 当且仅当 a
和 b
相等。与要求 a == b 是等式保持的要求一起,这意味着 ==
是对称的和传递的,并且进一步表明 ==
对于至少与另一个对象相等的所有对象 a
都是自反的。2) 概念
EqualityComparableWith<T, U>
指定在(可能混合的)T
和 U
操作数上的比较运算符 ==
和 !=
产生与相等性一致的结果。比较混合操作数产生的结果等效于比较转换为其通用类型的操作数。 正式地说,
EqualityComparableWith<T, U>
仅在以下情况下满足:给定类型 const std::remove_reference_t<T> 的任何左值 t
和类型 const std::remove_reference_t<U> 的任何左值 u
,并且令 C
为 ranges::common_reference_t<const std::remove_reference_t<T>&, const std::remove_reference_t<U>&>,bool(t == u) == bool(C(t) == C(u)).[编辑] 等式保持
如果表达式在给定相等输入的情况下产生相等输出,则该表达式是等式保持的。
- 表达式的输入包括其操作数。
- 表达式的输出包括其结果和表达式修改的所有操作数(如果有)。
要求等式保持的每个表达式还需要是稳定的:对具有相同输入对象的此类表达式进行两次评估必须具有相等的输出,除非对这些输入对象进行明确的中介修改。
[编辑] 隐式表达式变化
使用对于某些常量左值操作数非修改的表达式的requires-表达式还隐式地要求该表达式的其他变化,这些变化接受给定操作数的非常量左值或(可能为常量)右值,除非此类表达式变化在语义不同时被显式地要求。这些隐式表达式变化必须满足声明表达式的相同语义要求。实现验证变化语法的程度是未指定的。