名前空間
変種
操作

std::equality_comparable, std::equality_comparable_with

From cppreference.com
< 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は、2つの型が共通の型を共有し、いずれかの型のconst左辺値または非const右辺値(C++23以降)がその共通の型に変換可能であることを指定する。

目次

[編集] 意味論的要件

これらのコンセプトは、それらが満たされ、かつそれらが含むすべてのコンセプトがモデル化されている場合にのみモデル化される。

以下の段落では、式Eと型Cが与えられたとき、CONVERT_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が与えられた場合、bool(a == b)abが等しい場合に限りtrueである場合にのみモデル化される。a == b等価性を保持するという要件と合わせて、これは==が対称的かつ推移的であり、さらに他のオブジェクトと少なくとも1つ等しいすべてのオブジェクト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)は、t1t2と等しい場合に限りCONVERT_TO<C>(t2)と等しい。および
  • CONVERT_TO<C>(u1)は、u1u2と等しい場合に限りCONVERT_TO<C>(u2)と等しい。
(C++23から)

[編集] 等価性保持

標準ライブラリのコンセプトのrequiresで宣言された式は、(特に明記されていない限り)等価性保持である必要があります。

[編集] 暗黙の式バリエーション

一部の定数左辺値オペランドに対して非変更的である式を使用するrequiresは、暗黙の式バリエーションも必要とする。

[編集] 参照

  • C++23標準 (ISO/IEC 14882:2024)
  • 18.5.4 コンセプトequality_comparable [concept.equalitycomparable]
  • C++20 standard (ISO/IEC 14882:2020)
  • 18.5.3 コンセプトequality_comparable [concept.equalitycomparable]
English 日本語 中文(简体) 中文(繁體)