std::totally_ordered, std::totally_ordered_with
| Definiert in der Header-Datei <concepts> |
||
| template< class T > Konzept totally_ordered = |
(1) | (seit C++20) |
| template< class T, class U > Konzept totally_ordered_with = |
(2) | (seit C++20) |
| Hilfskonzepte |
||
| template< class T, class U > Konzept __PartiallyOrderedWith = |
(3) | (nur Exposition*) |
std::totally_ordered spezifiziert, dass die Vergleichsoperatoren ==,!=,<,>,<=,>= eines Typs Ergebnisse liefern, die mit einer strikt totalen Ordnung auf dem Typ konsistent sind.std::totally_ordered_with spezifiziert, dass die Vergleichsoperatoren ==,!=,<,>,<=,>= auf (möglicherweise gemischten) Operanden vom Typ T und U Ergebnisse liefern, die mit einer strikten totalen Ordnung konsistent sind. Der Vergleich gemischter Operanden liefert Ergebnisse, die äquivalent zum Vergleich der Operanden sind, die in ihren gemeinsamen Typ konvertiert wurden.__PartiallyOrderedWith spezifiziert, dass ein Wert vom Typ T und ein Wert vom Typ U in einer partiellen Ordnung miteinander verglichen werden können (in beliebiger Reihenfolge) unter Verwendung von <, >, <= und >=, und die Ergebnisse der Vergleiche konsistent sind.Inhalt |
[edit] Semantische Anforderungen
Diese Konzepte werden nur modelliert, wenn sie erfüllt sind und alle Konzepte, die sie umfassen, modelliert sind.
a, b und c vom Typ const std::remove_reference_t<T>- Genau einer der Ausdrücke bool(a < b), bool(a > b) und bool(a == b) ist true;
- Wenn bool(a < b) und bool(b < c) beide true sind, dann ist bool(a < c) true;
- bool(a > b) == bool(b < a)
- bool(a >= b) == !bool(a < b)
- bool(a <= b) == !bool(b < a)
-
tundt2, Lvalues, die unterschiedliche, gleiche Objekte der Typen const std::remove_reference_t<T> und std::remove_reference_t<T> bezeichnen, und -
uundu2, Lvalues, die unterschiedliche, 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
- bool(t < u) == bool(CONVERT_TO<C>(t2) < CONVERT_TO<C>(u2))
- bool(t > u) == bool(CONVERT_TO<C>(t2) > CONVERT_TO<C>(u2))
- bool(t <= u) == bool(CONVERT_TO<C>(t2) <= CONVERT_TO<C>(u2))
- bool(t >= u) == bool(CONVERT_TO<C>(t2) >= CONVERT_TO<C>(u2))
- bool(u < t) == bool(CONVERT_TO<C>(u2) < CONVERT_TO<C>(t2))
- bool(u > t) == bool(CONVERT_TO<C>(u2) > CONVERT_TO<C>(t2))
- bool(u <= t) == bool(CONVERT_TO<C>(u2) <= CONVERT_TO<C>(t2))
- bool(u >= t) == bool(CONVERT_TO<C>(u2) >= CONVERT_TO<C>(t2))
- jedes Lvalue
tvom Typ const std::remove_reference_t<T>, und - jedes Lvalue
uvom Typ const std::remove_reference_t<U>,
die folgenden Bedingungen erfüllt sind
-
t < u, t <= u, t > u, t >= u, u < t, u <= t, u > t, und u >= t denselben Definitionsbereich haben; - bool(t < u) == bool(u > t);
- bool(u < t) == bool(t > u);
- bool(t <= u) == bool(u >= t); und
- bool(u <= t) == bool(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] Referenzen
- C++23 Standard (ISO/IEC 14882:2024)
- 18.5.5 Konzept
totally_ordered[concept.totallyordered]
- 18.5.5 Konzept
- C++20 Standard (ISO/IEC 14882:2020)
- 18.5.4 Konzept
totally_ordered[concept.totallyordered]
- 18.5.4 Konzept
[edit] Siehe auch
| gibt an, dass der Operator <=> konsistente Ergebnisse für die gegebenen Typen liefert (Konzept) |