Namespaces
Variants

std::experimental::ranges:: EqualityComparable, std::experimental::ranges:: EqualityComparableWith

From cppreference.net
template < class T >
concept bool EqualityComparable = WeaklyEqualityComparableWith < T, T > ;
(1) (ranges TS)
template < class T, class U >

concept bool EqualityComparableWith =
EqualityComparable < T > &&
EqualityComparable < U > &&
CommonReference <
const std:: remove_reference_t < T > & ,
const std:: remove_reference_t < U > & > &&
EqualityComparable <
ranges:: common_reference_t <
const std:: remove_reference_t < T > & ,
const std:: remove_reference_t < U > & >> &&

WeaklyEqualityComparableWith < T, U > ;
(2) (ranges 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 操作数上,比较运算符 == != 产生与等价性一致的结果。混合操作数的比较结果应等价于将操作数转换为其公共类型后的比较结果。
形式化地讲,仅当给定类型为 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 ) ) ,才满足 EqualityComparableWith<T, U>

等值保持性

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

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

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

隐式表达式变体

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