名前空間
変種
操作

std::experimental::ranges::StrictTotallyOrdered, std::experimental::ranges::StrictTotallyOrderedWith

From cppreference.com
< cpp‎ | experimental‎ | ranges
 
 
 
 
コンセプトライブラリ
中核言語のコンセプト
                              
オブジェクトのコンセプト
                              
                              
比較のコンセプト
StrictTotallyOrderedStrictTotallyOrderedWith
呼び出し可能オブジェクトのコンセプト
                                        
                              
URNGコンセプト
 
template< class T >

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

    };
(1) (ranges TS)
template< class T, class U >

concept bool StrictTotallyOrderedWith =
    StrictTotallyOrdered<T> &&
    StrictTotallyOrdered<U> &&
    CommonReference<
        const std::remove_reference_t<T>&,
        const std::remove_reference_t<U>&> &&
    StrictTotallyOrdered<
        ranges::common_reference_t<
            const std::remove_reference_t<T>&,
            const std::remove_reference_t<U>&>> &&
    EqualityComparableWith<T, U> &&
    requires(const std::remove_reference_t<T>& t,
             const std::remove_reference_t<U>& u) {
        { t < u }  -> Boolean&&;
        { t > u }  -> Boolean&&;
        { t <= u } -> Boolean&&;
        { t >= u } -> Boolean&&;
        { u < t }  -> Boolean&&;
        { u > t }  -> Boolean&&;
        { u <= t } -> Boolean&&;
        { u >= t } -> Boolean&&;

    };
(2) (ranges TS)
1) コンセプト `StrictTotallyOrdered<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` が与えられ、`C` を ranges::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-expression で使用されるすべての式は、等価性を保持し、安定であることが要求され、式の評価は定数でないオペランドのみを変更できます。定数のオペランドは変更してはいけません。

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

ある定数左辺値オペランドに対して非変更的な式を使用する requires-expression は、明示的に異なる意味で要求されていない限り、そのオペランドに対して非定数左辺値または(定数であるか否かにかかわらず)右辺値を受け入れる、その式の追加のバリエーションも暗黙的に要求します。これらの 暗黙的な式バリエーション は、宣言された式の意味要件と同じ要件を満たさなければなりません。実装がこれらのバリエーションの構文をどの程度検証するかは未規定です。

English 日本語 中文(简体) 中文(繁體)