Namespaces
Variants

std::three_way_comparable, std::three_way_comparable_with

ja.cppreference.net より
 
 
ユーティリティライブラリ
言語サポート
型サポート (基本型、RTTI)
ライブラリ機能テストマクロ (C++20)
プログラムユーティリティ
可変長引数関数
コルーチンサポート (C++20)
契約サポート (C++26)
三方比較
(C++20)
(C++20)(C++20)(C++20)    
(C++20)(C++20)(C++20)

汎用ユーティリティ
関係演算子 (C++20で非推奨)
整数比較関数
(C++20)(C++20)(C++20)    
(C++20)
swap型操作
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
共通語彙型
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)



 
ヘッダ <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) T Cat std :: three_way_comparable < T, Cat > をモデル化するのは、型 const std:: remove_reference_t < T > の左辺値 a b が与えられたとき、以下が真である場合に限ります:
  • ( 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 ) 、および
  • Cat std::strong_ordering に変換可能な場合、 T totally_ordered をモデル化します。
2) T , U , and Cat model std :: three_way_comparable_with < T, U, Cat > only if given

C std:: 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 <=> u u <=> 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 ) 、および
  • Cat std::strong_ordering に変換可能な場合、 T U std:: totally_ordered_with < T, U > をモデル化する。

等価性保存

標準ライブラリコンセプトの requires expressions で宣言される式は、 equality-preserving であることが要求されます(特に明記されている場合を除く)。

暗黙的な式のバリエーション

A requires expression は、ある定数左辺値オペランドに対して非変更的な式を使用する場合、 暗黙的な式のバリエーション も要求します。

関連項目

operator == が同値関係であることを指定する
(concept)
型に対する比較演算子が全順序を生成することを指定する
(concept)