std::three_way_comparable, std::three_way_comparable_with
| ヘッダ <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) | (説明専用*) |
std::three_way_comparable は、三方比較演算子 <=> が T に対して、Cat によって暗示される比較カテゴリと矛盾しない結果を生成することを指定します。std::three_way_comparable_with は、三方比較演算子 <=> が (混合されうる) T と U の被演算子に対して、Cat によって暗示される比較カテゴリと矛盾しない結果を生成することを指定します。混合された被演算子の比較は、被演算子をそれらの共通型に変換した結果を比較することと同等です。__WeaklyEqualityComparableWith、__PartiallyOrderedWith、および __ComparisonCommonTypeWith は説明専用のコンセプトです。equality_comparable および totally_ordered の説明を参照してください。
セマンティック要件
これらの概念は、それらが満たされ、かつそれらが包含するすべての概念がモデル化されている場合にのみモデル化されます。
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をモデル化します。
T
,
U
, and
Cat
model
std
::
three_way_comparable_with
<
T, U, Cat
>
only if given
-
tとt2、それぞれ型 const std:: remove_reference_t < T > および std:: remove_reference_t < T > の互いに等しい別個のオブジェクトを表す左辺値、および -
uとu2、それぞれ型 const std:: remove_reference_t < U > および std:: remove_reference_t < U > の互いに等しい別個のオブジェクトを表す左辺値。
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まで) |
|
(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) |