std::three_way_comparable, std::three_way_comparable_with
| Definiert in der Header-Datei <compare> |
||
| template< class T, class Cat = std::partial_ordering > concept three_way_comparable = |
(1) | (seit C++20) |
| template< class T, class U, class Cat = std::partial_ordering > concept three_way_comparable_with = |
(2) | (seit C++20) |
| template< class T, class Cat > concept __ComparesAs = |
(3) | (nur Exposition*) |
std::three_way_comparable gibt an, dass der Drei-Wege-Vergleichsoperator <=> auf T Ergebnisse liefert, die mit der durch Cat implizierten Vergleichskategorie konsistent sind.std::three_way_comparable_with gibt an, dass der Drei-Wege-Vergleichsoperator <=> auf (möglicherweise gemischten) Operanden T und U Ergebnisse liefert, die mit der durch Cat implizierten Vergleichskategorie konsistent sind. Der Vergleich von gemischten Operanden liefert Ergebnisse, die mit dem Vergleich der Operanden, die in ihren gemeinsamen Typ konvertiert wurden, äquivalent sind.__WeaklyEqualityComparableWith, __PartiallyOrderedWith und __ComparisonCommonTypeWith sind Konzepte nur zur Veranschaulichung. Siehe Beschreibungen von equality_comparable und totally_ordered.
Inhalt |
[edit] Semantische Anforderungen
Diese Konzepte werden nur modelliert, wenn sie erfüllt sind und alle Konzepte, die sie umfassen, modelliert sind.
T und Cat modellieren std::three_way_comparable<T, Cat> nur, wenn für L-Werte a und b vom Typ const std::remove_reference_t<T>, Folgendes gilt:- (a <=> b == 0) == bool(a == b),
- (a <=> b != 0) == bool(a != b),
- ((a <=> b) <=> 0) und (0 <=> (b <=> a)) sind gleich,
- 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), und
- (a <=> b >= 0) == bool(a >= b), und
- wenn
Catin std::strong_ordering konvertierbar ist, modelliertTtotally_ordered.
T, U und Cat modellieren std::three_way_comparable_with<T, U, Cat> nur, wenn gegeben-
tundt2, L-Werte, die sich auf verschiedene gleiche Objekte der Typen const std::remove_reference_t<T> und std::remove_reference_t<T> bezeichnen, und -
uundu2, L-Werte, die sich auf verschiedene gleiche Objekte der Typen const std::remove_reference_t<U> und std::remove_reference_t<U> bezeichnen.
Sei C std::common_reference_t<const std::remove_reference_t<T>&, const std::remove_reference_t<U>&> und sei für einen Ausdruck E und einen Typ C CONVERT_TO<C>(E):
|
(bis C++23) |
|
(seit C++23) |
die folgenden Bedingungen erfüllt sind
- t <=> u und u <=> t haben denselben Definitionsbereich,
- ((t <=> u) <=> 0) und (0 <=> (u <=> t)) sind gleich,
- (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), und
- wenn
Catin std::strong_ordering konvertierbar ist, modellierenTundUstd::totally_ordered_with<T, U>.
[bearbeiten] Gleichheitserhaltung
Ausdrücke, die in requires-Ausdrücken der Standardbibliothekskonzepte deklariert sind, müssen gleichheitserhaltend sein (sofern nicht anders angegeben).
[bearbeiten] Implizite Ausdrucksvariationen
Ein requires-Ausdruck, der einen Ausdruck verwendet, der für einen konstanten Lvalue-Operanden nicht-modifizierend ist, erfordert ebenfalls implizite Ausdrucksvariationen.
[edit] Siehe auch
| gibt an, dass der Operator == eine Äquivalenzrelation ist (Konzept) | |
| gibt an, dass die Vergleichsoperatoren des Typs eine Totalordnung ergeben (Konzept) |