命名空间
变体
操作

std::equality_comparable, std::equality_comparable_with

来自 cppreference.cn
< cpp‎ | concepts
定义于头文件 <concepts>
template< class T >
concept equality_comparable = __WeaklyEqualityComparableWith<T, T>;
(1) (自 C++20 起)
template< class T, class U >

concept equality_comparable_with =
    std::equality_comparable<T> &&
    std::equality_comparable<U> &&
    __ComparisonCommonTypeWith<T, U> &&
    std::equality_comparable<
        std::common_reference_t<
            const std::remove_reference_t<T>&,
            const std::remove_reference_t<U>&>> &&

    __WeaklyEqualityComparableWith<T, U>;
(2) (自 C++20 起)
辅助概念
template< class T, class U >

concept __WeaklyEqualityComparableWith =
    requires(const std::remove_reference_t<T>& t,
             const std::remove_reference_t<U>& u) {
        { t == u } -> boolean-testable;
        { t != u } -> boolean-testable;
        { u == t } -> boolean-testable;
        { u != t } -> boolean-testable;

    };
(3) (仅为示例目的而设。实现不需要以这种方式定义实体。此实体的名称未指定。)
(4)
template< class T, class U >

concept __ComparisonCommonTypeWith =
    std::common_reference_with<
        const std::remove_reference_t<T>&,

        const std::remove_reference_t<U>&>;
(直至 C++23)
(仅为示例目的而设。实现不需要以这种方式定义实体。此实体的名称未指定。)
template< class T, class U, class C = std::common_reference_t<const T&, const U&> >

concept _ComparisonCommonTypeWithImpl =
    std::same_as<std::common_reference_t<const T&, const U&>,
                 std::common_reference_t<const U&, const T&>> &&
    requires {
        requires std::convertible_to<const T&, const C&> ||
            std::convertible_to<T, const C&>;
        requires std::convertible_to<const U&, const C&> ||
            std::convertible_to<U, const C&>;
    };
template< class T, class U >
concept __ComparisonCommonTypeWith =

    _ComparisonCommonTypeWithImpl<std::remove_cvref_t<T>, std::remove_cvref_t<U>>;
(自 C++23 起)
(仅为示例目的而设。实现不需要以这种方式定义实体。此实体的名称未指定。)
1) 概念 std::equality_comparable 规定了类型 T 上的比较运算符 ==!= 反映相等性:当且仅当操作数相等时,== 产生 true
2) 概念 std::equality_comparable_with 规定了(可能混合的)类型 TU 的操作数上的比较运算符 ==!= 产生与相等性一致的结果。比较混合操作数产生的结果等价于比较转换为其共同类型的操作数的结果。
3) 仅供展示的概念 __WeaklyEqualityComparableWith 规定了类型 T 的对象和类型 U 的对象可以使用 ==!= 相互比较相等性(以任一顺序),并且比较结果是一致的。
4) 仅供展示的概念 __ComparisonCommonTypeWith 规定了两种类型共享一个共同类型,并且任一类型的 const 左值或非 const 右值(自 C++23 起) 可转换为该共同类型。

目录

[编辑] 语义要求

这些概念仅在它们被满足且它们所包含的所有概念都被建模时才被建模。

在以下段落中,给定表达式 E 和类型 CCONVERT_TO<C>(E) 定义为

(直至 C++23)
  • static_cast<const C&>(std::as_const(E)) 如果这是一个有效的表达式,
  • static_cast<const C&>(std::move(E)) 否则。
(自 C++23 起)
1) std::equality_comparable<T> 仅当给定类型 T 的对象 abbool(a == b) 当且仅当 ab 相等时为 true 时才被建模。 结合 a == b相等保持 的要求,这意味着 == 是对称的和传递的,并且进一步意味着 == 对于所有与至少一个其他对象相等的对象 a 是自反的。
2) std::equality_comparable_with<T, U> 仅当,令

以下表达式为真

  • bool(t == u) == bool(CONVERT_TO<C>(t2) == CONVERT_TO<C>(u2)).
3) __WeaklyEqualityComparableWith<T, U> 仅当给定

以下各项为真

  • t == uu == tt != uu != t 具有相同的域;
  • bool(u == t) == bool(t == u);
  • bool(t != u) == !bool(t == u);以及
  • bool(u != t) == bool(t != u).
4) __WeaklyEqualityComparableWith<T, U> 仅当

对应的 common_reference_with 概念被建模时才被建模。

(直至 C++23)

以下条件成立

  • CONVERT_TO<C>(t1) 等于 CONVERT_TO<C>(t2) 当且仅当 t1 等于 t2;并且
  • CONVERT_TO<C>(u1) 等于 CONVERT_TO<C>(u2) 当且仅当 u1 等于 u2
(自 C++23 起)

[编辑] 相等性保持

在标准库概念的 requires 表达式 中声明的表达式需要是 相等保持 的(除非另有说明)。

[编辑] 隐式表达式变体

requires 表达式,对于某些常量左值操作数,它使用非修改表达式,也需要 隐式表达式变体

[编辑] 参考文献

  • C++23 标准 (ISO/IEC 14882:2024)
  • 18.5.4 概念 equality_comparable [concept.equalitycomparable]
  • C++20 标准 (ISO/IEC 14882:2020)
  • 18.5.3 概念 equality_comparable [concept.equalitycomparable]