Namespaces
Variants

std:: equality_comparable, std:: equality_comparable_with

From cppreference.net
(注:提供されたHTMLフラグメントには翻訳対象となるテキストコンテンツが含まれていないため、元の構造をそのまま保持しています)
定義先ヘッダ <concepts>
template < class T >
concept equality_comparable = __WeaklyEqualityComparableWith < T, T > ;
(1) (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) (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) ( 説明専用* )
(4)
template < class T, class U >

concept __ComparisonCommonTypeWith =
std:: common_reference_with <
const std:: remove_reference_t < T > & ,

const std:: remove_reference_t < U > & > ;
(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 >> ;
(C++23から)
( 説明専用* )
1) std::equality_comparable コンセプトは、 T の比較演算子 == および != が等価性を反映することを指定します: == はオペランドが等価である場合にのみ true を返します。
2) std::equality_comparable_with コンセプトは、 == および != 比較演算子が(混在する可能性のある) T および U オペランドに対して、等価性と整合性のある結果を返すことを指定します。混在したオペランドの比較は、オペランドを共通の型に変換して比較した場合と等価な結果を返します。
3) 説明専用コンセプト __WeaklyEqualityComparableWith は、型 T のオブジェクトと型 U のオブジェクトが相互に(どちらの順序でも) == および != を使用して等値比較可能であり、比較結果が一貫していることを指定する。
4) 説明専用コンセプト __ComparisonCommonTypeWith は、2つの型が共通の型を共有し、いずれかの型のconst左辺値 または非const右辺値 (C++23以降) がその共通型に変換可能であることを指定する。

目次

セマンティック要件

これらの概念は、それらが満たされ、かつそれらが包含するすべての概念がモデル化されている場合にのみモデル化されます。

以下の段落では、式 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以降)
1) std :: equality_comparable < T > は、型 T のオブジェクト a および b が与えられたとき、 a b が等価である場合にのみ bool ( a == b ) true となる場合にのみモデル化される。 equality-preserving (等価性保存)の要件と合わせて、これは == が対称的かつ推移的であることを意味し、さらに少なくとも1つの他のオブジェクトと等価なすべてのオブジェクト a に対して == が反射的であることを示す。
2) std :: equality_comparable_with < T, U > は、以下の条件が満たされる場合にのみモデル化される:

以下の式が真となる:

  • bool ( t == u ) == bool ( CONVERT_TO < C > ( t2 ) == CONVERT_TO < C > ( u2 ) )
3) __WeaklyEqualityComparableWith < 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 )
4) __WeaklyEqualityComparableWith < T, U > は以下の場合にのみモデル化される:

対応する common_reference_with コンセプトがモデル化されている場合。

(C++23まで)

以下を定義する:

以下の条件が満たされること:

  • CONVERT_TO < C > ( t1 ) CONVERT_TO < C > ( t2 ) と等しいのは t1 t2 と等しい場合に限る;かつ
  • CONVERT_TO < C > ( u1 ) CONVERT_TO < C > ( u2 ) と等しいのは u1 u2 と等しい場合に限る。
(C++23以降)

等価性保存

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

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

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

参考文献

  • C++23標準 (ISO/IEC 14882:2024):
  • 18.5.4 コンセプト equality_comparable [concept.equalitycomparable]
  • C++20規格 (ISO/IEC 14882:2020):
  • 18.5.3 コンセプト equality_comparable [concept.equalitycomparable]