std::equality_comparable, std::equality_comparable_with
| ヘッダ <concepts> で定義 |
||
| template< class T > concept equality_comparable = __WeaklyEqualityComparableWith<T, T>; |
(1) | (C++20以降) |
| template< class T, class U > concept equality_comparable_with = |
(2) | (C++20以降) |
| ヘルパーコンセプト |
||
| template< class T, class U > concept __WeaklyEqualityComparableWith = |
(3) | (説明用*) |
| (4) | ||
| template< class T, class U > concept __ComparisonCommonTypeWith = |
(C++23まで) (説明用*) |
|
| template< class T, class U, class C = std::common_reference_t<const T&, const U&> > concept _ComparisonCommonTypeWithImpl = |
(C++23から) (説明用*) |
|
std::equality_comparableは、型Tにおける比較演算子==および!=が等価性を反映することを指定する。すなわち、オペランドが等しい場合に限り==がtrueとなる。std::equality_comparable_withは、(おそらく混在した)TとUのオペランドに対する比較演算子==と!=が、等価性と一致する結果を生成することを指定する。混在したオペランドを比較すると、オペランドをその共通の型に変換して比較するのと同等の結果が得られる。__WeaklyEqualityComparableWithは、型Tのオブジェクトと型Uのオブジェクトを、==と!=の両方を使用して相互に(どちらの順序でも)等価性について比較でき、比較の結果が一致することを指定する。__ComparisonCommonTypeWithは、2つの型が共通の型を共有し、いずれかの型のconst左辺値または非const右辺値(C++23以降)がその共通の型に変換可能であることを指定する。目次 |
[編集] 意味論的要件
これらのコンセプトは、それらが満たされ、かつそれらが含むすべてのコンセプトがモデル化されている場合にのみモデル化される。
以下の段落では、式Eと型Cが与えられたとき、CONVERT_TO<C>(E)は次のように定義される。
|
(C++23まで) |
|
(C++23から) |
Tのオブジェクトaとbが与えられた場合、bool(a == b)がaとbが等しい場合に限りtrueである場合にのみモデル化される。a == bが等価性を保持するという要件と合わせて、これは==が対称的かつ推移的であり、さらに他のオブジェクトと少なくとも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式は、暗黙の式バリエーションも必要とする。
[編集] 参照
- C++23標準 (ISO/IEC 14882:2024)
- 18.5.4 コンセプト
equality_comparable[concept.equalitycomparable]
- 18.5.4 コンセプト
- C++20 standard (ISO/IEC 14882:2020)
- 18.5.3 コンセプト
equality_comparable[concept.equalitycomparable]
- 18.5.3 コンセプト