名前空間
変種
操作

std::EqualityComparable, std::EqualityComparableWith

提供: cppreference.com
< cpp‎ | concepts
ヘッダ <concepts> で定義
template <class T, class U>

concept __WeaklyEqualityComparableWith = // exposition only
  requires(const std::remove_reference_t<T>& t,
           const std::remove_reference_t<U>& u) {
    t == u; requires std::Boolean<decltype(t == u)>;
    t != u; requires std::Boolean<decltype(t != u)>;
    u == t; requires std::Boolean<decltype(u == t)>;
    u != t; requires std::Boolean<decltype(u != t)>;

  };
(1)
template < class T >
concept EqualityComparable = __WeaklyEqualityComparableWith<T, T>;
(2) (C++20以上)
template <class T, class U>

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

  __WeaklyEqualityComparableWith<T, U>;
(3) (C++20以上)
1) 説明専用コンセプト __WeaklyEqualityComparableWith<T, U>T 型のオブジェクトと U 型のオブジェクトが == および != の両方を使用してお互いに (いずれかの順序で) 等しさを比較することができ、その比較の結果が一貫性を持つことを表します。
より形式的には、 __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)
2) コンセプト EqualityComparable<T>T に対する比較演算子 == および != が等しさを反映することを表します。 == は被演算子が等しい場合に限り true を返します。
EqualityComparable<T> は、 T 型のオブジェクト a および b が与えられたとき、 ab が等しい場合に限り bool(a == b)true である場合にのみ、満たされます。 a == b が等しさを維持することの要件と共に、これは == が対称性および推移性を持つことを暗黙に示し、さらに少なくともひとつの他のオブジェクトと等しいすべてのオブジェクト a について反射性を持ちます。
3) コンセプト EqualityComparableWith<T, U> は、 T および U の被演算子 (混合かもしれない) に対する比較演算子 == および != が等しさと一貫性を持つ結果を返すことを表します。 混合した被演算子の比較はそれらの共通型に変換した被演算子の比較と同等の結果を返します。
形式的には、 EqualityComparableWith<T, U> は、 const std::remove_reference_t<T> 型の任意の左辺値 t および const std::remove_reference_t<U> 型の任意の左辺値 u が与えられたとき、 Cstd::common_reference_t<const std::remove_reference_t<T>&, const std::remove_reference_t<U>&>C とすると、 bool(t == u) == bool(C(t) == C(u)) である場合にのみ、満たされます。

[編集] 等しさの維持

等しい入力を与えると等しい出力が得られる場合、その式は等しさを維持します。

  • 式への入力がその被演算子から構成される。
  • 式の出力がその結果およびその式によって変更されるすべての被演算子 (もしあれば) から構成される。

等しさを維持することが要求されるすべての式は、さらに安定であることも要求されます。 同じ入力オブジェクトを用いたそのような式の2回の評価は、間にそれらの入力オブジェクトの変更が明示的に挟まれなければ、等しい出力が得られなければなりません。

特に明記されない限り、 requires 式で使用されるすべての式は、等しさを維持することと安定であることが要求され、式の評価は非定数の被演算子のみを変更することができます。 定数である被演算子は変更してはなりません。

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

何らかの定数左辺値の被演算子に対して変更しない式を使用する requires 式は、そのような式のバリエーションが異なるセマンティクスで明示的に要求されなければ、与えられた被演算子に対して非定数左辺値または (定数かもしれない) 右辺値を受理するその式の追加のバリエーションも暗黙に要求します。 これらの暗黙の式のバリエーションは、宣言された式のセマンティクスの要件を満たさなければなりません。 処理系がバリエーションの構文を検証する範囲は未規定です。