std::equality_comparable, std::equality_comparable_with
| ヘッダで定義 <concepts>
|
||
template< class T >
concept equality_comparable = __WeaklyEqualityComparableWith<T, T>;
|
(1) | (since C++20) |
template< class T, class U >
concept equality_comparable_with =
std::equality_comparable<T> &&
std::equality_comparable<U> &&
__ComparisonCommonTypeWith<T, U> &&
std::equality_comparable<
std::common_reference_t<
const std::remove_reference_t<T>&,
const std::remove_reference_t<U>&>> &&
__WeaklyEqualityComparableWith<T, U>;
|
(2) | (since C++20) |
| ヘルパーコンセプト |
||
template< class T, class U >
concept __WeaklyEqualityComparableWith =
requires(const std::remove_reference_t<T>& t,
const std::remove_reference_t<U>& u) {
{ t == u } -> boolean-testable;
{ t != u } -> boolean-testable;
{ u == t } -> boolean-testable;
{ u != t } -> boolean-testable;
};
|
(3) | (説明専用*) |
template< class T, class U >
concept __ComparisonCommonTypeWith =
std::common_reference_with<
const std::remove_reference_t<T>&,
const std::remove_reference_t<U>&>;
|
(4) | (until C++23) (説明専用*) |
template< class T, class U, class C = std::common_reference_t<const T&, const U&> >
concept _ComparisonCommonTypeWithImpl =
std::same_as<std::common_reference_t<const T&, const U&>,
std::common_reference_t<const U&, const T&>> &&
requires {
requires std::convertible_to<const T&, const C&> ||
std::convertible_to<T, const C&>;
requires std::convertible_to<const U&, const C&> ||
std::convertible_to<U, const C&>;
};
template< class T, class U >
concept __ComparisonCommonTypeWith =
_ComparisonCommonTypeWithImpl<std::remove_cvref_t<T>, std::remove_cvref_t<U>>;
|
(since C++23) (説明専用*) |
|
std::equality_comparable は、比較演算子 == と != に対する T が等価性を反映することを指定します: == は true を返し、被演算子が等しい場合に限ります。std::equality_comparable_with は、比較演算子 == と != を (混合される可能性のある) T と U の被演算子が等価性と一致する結果を生成します。混合された被演算子の比較は、それらを共通の型に変換した被演算子を比較するのと同等の結果を生成します。__WeaklyEqualityComparableWith は、型 T のオブジェクトと型 U のオブジェクトは、互いに等価性を (任意の順序で) 比較でき、その際に == と != を使用し、比較の結果が一貫していることを指定します。__ComparisonCommonTypeWith は、2つの型が共通の型を共有し、const 左辺値 または非 const 右辺値(since C++23) のいずれかの型がその共通の型に変換可能であることを指定します。セマンティック要件
これらの概念は、それらが満たされ、かつそれらが包含するすべての概念がモデル化されている場合にのみモデル化されます。
以下の段落では、式
E
と型
C
が与えられた場合、
CONVERT_TO
<
C
>
(
E
)
は次のように定義されます:
|
(C++23まで) |
|
(C++23以降) |
Tのオブジェクトaおよびbが与えられたとき、aとbが等価である場合にのみ
bool
(
a
==
b
)
が
true
となる場合にのみモデル化される。
equality-preserving
(等価性保存)の要件と合わせて、これは==が対称的かつ推移的であることを意味し、さらに少なくとも1つの他のオブジェクトと等価なすべてのオブジェクトaに対して==が反射的であることを示す。
-
tとt2を、それぞれ型 const std:: remove_reference_t < T > および std:: remove_cvref_t < T > の、互いに等しいが異なるオブジェクトを表す左辺値とし、 -
uとu2を、それぞれ型 const std:: remove_reference_t < U > および std:: remove_cvref_t < U > の、互いに等しいが異なるオブジェクトを表す左辺値とし、 -
Cを std:: common_reference_t < const std:: remove_reference_t < T > & , const std:: remove_reference_t < U > & > とするとき、
以下の式が真となる:
- bool ( t == u ) == bool ( CONVERT_TO < C > ( t2 ) == CONVERT_TO < C > ( u2 ) ) 。
-
t、型 const std:: remove_reference_t < T > の左辺値、および -
u、型 const std:: remove_reference_t < U > の左辺値が与えられたとき、
以下が真である場合です:
- t == u 、 u == t 、 t ! = u 、 u ! = t が同じ定義域を持つこと;
- bool ( u == t ) == bool ( t == u ) ;
- bool ( t ! = u ) == ! bool ( t == u ) ;および
- bool ( u ! = t ) == bool ( t ! = u ) 。
|
対応する
|
(C++23まで) |
|
以下を定義する:
以下の条件が満たされること:
|
(C++23以降) |
等価性保存
標準ライブラリコンセプトの requires 式 で宣言される式は、 (特に明記されていない限り) 等価性保存 が要求されます。
暗黙的な式のバリエーション
定数左辺値オペランドに対して非変更式を使用する requires expression は、 暗黙的な式バリエーション も要求します。
参考文献
- C++23標準 (ISO/IEC 14882:2024):
-
-
18.5.4 コンセプト
equality_comparable[concept.equalitycomparable]
-
18.5.4 コンセプト
- C++20規格 (ISO/IEC 14882:2020):
-
-
18.5.3 コンセプト
equality_comparable[concept.equalitycomparable]
-
18.5.3 コンセプト