名前空間
変種
操作

std::three_way_comparable, std::three_way_comparable_with

From cppreference.com
< cpp‎ | utility
 
 
ユーティリティライブラリ
言語サポート
型のサポート (基本型、RTTI)
ライブラリ機能検査マクロ (C++20)
プログラムユーティリティ
可変引数関数
コルーチンサポート (C++20)
契約サポート (C++26)
三方比較
three_way_comparablethree_way_comparable_with
(C++20)(C++20)
(C++20)
(C++20)(C++20)(C++20)  
(C++20)(C++20)(C++20)

汎用ユーティリティ
関係演算子 (C++20で非推奨)
 
ヘッダ <compare> で定義
template< class T, class Cat = std::partial_ordering >

concept three_way_comparable =
    __WeaklyEqualityComparableWith<T, T> &&
    __PartiallyOrderedWith<T, T> &&
    requires(const std::remove_reference_t<T>& a,
             const std::remove_reference_t<T>& b) {
        { a <=> b } -> __ComparesAs<Cat>;

    };
(1) (C++20以降)
template< class T, class U, class Cat = std::partial_ordering >

concept three_way_comparable_with =
    std::three_way_comparable<T, Cat> &&
    std::three_way_comparable<U, Cat> &&
    __ComparisonCommonTypeWith<T, U> &&
    std::three_way_comparable<
        std::common_reference_t<
            const std::remove_reference_t<T>&,
            const std::remove_reference_t<U>&>, Cat> &&
    __WeaklyEqualityComparableWith<T, U> &&
    __PartiallyOrderedWith<T, U> &&
    requires(const std::remove_reference_t<T>& t,
             const std::remove_reference_t<U>& u) {
        { t <=> u } -> __ComparesAs<Cat>;
        { u <=> t } -> __ComparesAs<Cat>;

    };
(2) (C++20以降)
template< class T, class Cat >

concept __ComparesAs =

    std::same_as<std::common_comparison_category_t<T, Cat>, Cat>;
(3) (説明用*)
1) コンセプト std::three_way_comparable は、T の三方比較演算子 <=>Cat によって示される比較カテゴリと一貫した結果を生成することを指定します。
2) コンセプト std::three_way_comparable_with は、(型が混在している可能性のある) TU オペランドに対する三方比較演算子 <=>Cat によって示される比較カテゴリと一貫した結果を生成することを指定します。混在したオペランドの比較は、オペランドを共通型に変換して比較するのと同等の結果を生成します。

__WeaklyEqualityComparableWith, __PartiallyOrderedWith, および __ComparisonCommonTypeWith は、説明専用のコンセプトです。equality_comparable および totally_ordered の説明を参照してください。

目次

[編集] 意味論的要件

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

1) TCatstd::three_way_comparable<T, Cat> をモデルするのは、型 const std::remove_reference_t<T> の左辺値 ab が与えられた場合に、以下の条件が真であるときだけです。
  • (a <=> b == 0) == bool(a == b),
  • (a <=> b != 0) == bool(a != b),
  • ((a <=> b) <=> 0)(0 <=> (b <=> a)) は等しく、
  • bool(a > b) == bool(b < a),
  • bool(a >= b) == !bool(a < b),
  • bool(a <= b) == !bool(b < a),
  • (a <=> b < 0) == bool(a < b),
  • (a <=> b > 0) == bool(a > b),
  • (a <=> b <= 0) == bool(a <= b)、および
  • (a <=> b >= 0) == bool(a >= b)、および
  • Catstd::strong_ordering に変換可能である場合、Ttotally_ordered をモデルします。
2) TU、および Catstd::three_way_comparable_with<T, U, Cat> をモデルするのは、以下が与えられた場合のみです。

Cstd::common_reference_t<const std::remove_reference_t<T>&, const std::remove_reference_t<U>&> とし、式 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から)

以下の条件が真である。

  • t <=> uu <=> t は同じ領域を持ち、
  • ((t <=> u) <=> 0)(0 <=> (u <=> t)) は等しく、
  • (t <=> u == 0) == bool(t == u),
  • (t <=> u != 0) == bool(t != u),
  • Cat(t <=> u) == Cat(CONVERT_TO<C>(t2) <=> CONVERT_TO<C>(u2)),
  • (t <=> u < 0) == bool(t < u),
  • (t <=> u > 0) == bool(t > u),
  • (t <=> u <= 0) == bool(t <= u),
  • (t <=> u >= 0) == bool(t >= u)、および
  • Catstd::strong_ordering に変換可能である場合、TUstd::totally_ordered_with<T, U> をモデルします。

[編集] 等価性保持

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

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

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

[編集] 関連項目

演算子==が同値関係であることを規定する
(コンセプト) [編集]
その型の比較演算子が全順序をもたらすことを規定する
(コンセプト) [編集]
English 日本語 中文(简体) 中文(繁體)