名前空間
変種
操作

std::StrictTotallyOrdered, std::StrictTotallyOrderedWith

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

concept StrictTotallyOrdered =
  std::EqualityComparable<T> &&
  requires(const std::remove_reference_t<T>& a,
           const std::remove_reference_t<T>& b) {
    a < b;  requires std::Boolean<decltype(a < b)>;
    a > b;  requires std::Boolean<decltype(a > b)>;
    a <= b; requires std::Boolean<decltype(a <= b)>;
    a >= b; requires std::Boolean<decltype(a >= b)>;

  };
(1) (C++20以上)
template <class T, class U>

concept StrictTotallyOrderedWith =
  std::StrictTotallyOrdered<T> &&
  std::StrictTotallyOrdered<U> &&
  std::CommonReference<
    const std::remove_reference_t<T>&,
    const std::remove_reference_t<U>&> &&
  std::StrictTotallyOrdered<
    std::common_reference_t<
      const std::remove_reference_t<T>&,
      const std::remove_reference_t<U>&>> &&
  std::EqualityComparableWith<T, U> &&
  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)>;
    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)>;
    u <= t; requires std::Boolean<decltype(u <= t)>;
    u >= t; requires std::Boolean<decltype(u >= t)>;

  };
(2) (C++20以上)
1) コンセプト StrictTotallyOrdered<T> は、 T に対する比較演算子 ==,!=,<,>,<=,>=T に対する全順序と一貫性のある結果を返すことを表します。

StrictTotallyOrdered<T> は、 const std::remove_reference_t<T> 型の左辺値 a, b, c が与えられたとき、以下の内容を満たす場合にのみ、満たされます。

  • bool(a < b)bool(a > b) または bool(a == b) のいずれかひとつだけが true
  • bool(a < b)bool(b < c) の両方が true の場合、 bool(a < c)true
  • bool(a > b) == bool(b < a)
  • bool(a >= b) == !bool(a < b)
  • bool(a <= b) == !bool(b < a)
2) コンセプト StrictTotallyOrderedWith<T, U> は、 T および U の被演算子 (混合かもしれない) に対する比較演算子 ==,!=,<,>,<=,>= が厳密な全順序と一貫性のある結果を返すことを表します。 混合した被演算子の比較はその共通型に変換された被演算子の比較と同等の結果を返します。

形式的には、 StrictTotallyOrderedWith<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>&> とすると、以下の内容が満たされる場合にのみ、満たされます。

  • bool(t < u) == bool(C(t) < C(u))
  • bool(t > u) == bool(C(t) > C(u))
  • bool(t <= u) == bool(C(t) <= C(u))
  • bool(t >= u) == bool(C(t) >= C(u))
  • bool(u < t) == bool(C(u) < C(t))
  • bool(u > t) == bool(C(u) > C(t))
  • bool(u <= t) == bool(C(u) <= C(t))
  • bool(u >= t) == bool(C(u) >= C(t))

[編集] 等しさの維持

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

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

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

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

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

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