名稱空間
變體
操作

std::equality_comparable, std::equality_comparable_with

來自 cppreference.com
< cpp‎ | 概念
定義於標頭檔案 <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 的物件 ab,當且僅當 ab 相等時,bool(a == b)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)

以下條件成立:

  • 當且僅當 t1 等於 t2 時,CONVERT_TO<C>(t1) 等於 CONVERT_TO<C>(t2);以及
  • 當且僅當 u1 等於 u2 時,CONVERT_TO<C>(u1) 等於 CONVERT_TO<C>(u2)
(C++23 起)

[編輯] 保持相等

標準庫概念的 requires 表示式中宣告的表示式必須是保持相等的(除非另有說明)。

[編輯] 隱式表示式變體

使用對於某個常量左值運算元是非修改性表示式的 requires 表示式也需要隱式表示式變體

[編輯] 參考

  • C++23 標準 (ISO/IEC 14882:2024)
  • 18.5.4 Concept equality_comparable [concept.equalitycomparable]
  • C++20 標準 (ISO/IEC 14882:2020)
  • 18.5.3 Concept equality_comparable [concept.equalitycomparable]