std::experimental::ranges::StrictTotallyOrdered, std::experimental::ranges::StrictTotallyOrderedWith
| Definiert in Header <experimental/ranges/concepts> |
||
| template< class T > concept bool StrictTotallyOrdered = |
(1) | (Ranges TS) |
| template< class T, class U > concept bool StrictTotallyOrderedWith = |
(2) | (Ranges TS) |
StrictTotallyOrdered<T> gibt an, dass die Vergleichsoperatoren ==,!=,<,>,<=,>= auf T Ergebnisse liefern, die mit einer strikt totalen Ordnung auf T konsistent sind.StrictTotallyOrdered<T> ist nur dann erfüllt, wenn für beliebige lvalues a, b und c vom Typ const std::remove_reference_t<T> gilt:
- Genau eine der folgenden Aussagen ist true: bool(a < b), bool(a > b) und bool(a == b);
- Wenn sowohl bool(a < b) als auch bool(b < c) 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)
StrictTotallyOrderedWith<T, U> gibt an, dass die Vergleichsoperatoren ==,!=,<,>,<=,>= auf (möglicherweise gemischten) Operanden T und U Ergebnisse liefern, die mit einer strikt totalen Ordnung konsistent sind. Der Vergleich gemischter Operanden liefert Ergebnisse, die äquivalent zum Vergleich der Operanden sind, die in ihren gemeinsamen Typ konvertiert wurden.Formal gilt: StrictTotallyOrderedWith<T, U> ist nur dann erfüllt, wenn für jeden lvalue t vom Typ const std::remove_reference_t<T> und jeden lvalue u vom Typ const std::remove_reference_t<U> gilt, und sei C ranges::common_reference_t<const std::remove_reference_t<T>&, const std::remove_reference_t<U>&>
- bool(t < u) == bool(C(t) < C(u))
- bool(t > u) == bool(C(t) > C(u))
- bool(t <= u) == bool(C(t) <= C(u))
- bool(t >= u) == bool(C(t) >= C(u))
- bool(u < t) == bool(C(u) < C(t))
- bool(u > t) == bool(C(u) > C(t))
- bool(u <= t) == bool(C(u) <= C(t))
- bool(u >= t) == bool(C(u) >= C(t))
[bearbeiten] Gleichheitserhaltung
Ein Ausdruck ist gleichheitserhaltend, wenn er bei gleichen Eingaben gleiche Ausgaben liefert.
- Die Eingaben für einen Ausdruck bestehen aus seinen Operanden.
- Die Ausgaben eines Ausdrucks bestehen aus seinem Ergebnis und allen von dem Ausdruck modifizierten Operanden (falls vorhanden).
Jeder Ausdruck, der gleichheitserhaltend sein muss, muss außerdem stabil sein: Zwei Auswertungen eines solchen Ausdrucks mit denselben Eingabeobjekten müssen gleiche Ausgaben liefern, solange keine explizite zwischenzeitliche Modifikation dieser Eingabeobjekte erfolgt.
Sofern nicht anders angegeben, muss jeder in einem requires-expression verwendete Ausdruck gleichheitserhaltend und stabil sein, und die Auswertung des Ausdrucks darf nur seine nicht-konstanten Operanden modifizieren. Operanden, die konstant sind, dürfen nicht modifiziert werden.
[bearbeiten] Implizite Ausdrucksvariationen
Ein requires-expression, der einen Ausdruck verwendet, der für einen konstanten lvalue-Operanden nicht-modifizierend ist, erfordert implizit auch zusätzliche Variationen dieses Ausdrucks, die einen nicht-konstanten lvalue oder (möglicherweise konstanten) rvalue für den gegebenen Operanden akzeptieren, es sei denn, eine solche Ausdrucksvariation ist explizit mit abweichender Semantik erforderlich. Diese impliziten Ausdrucksvariationen müssen die gleichen semantischen Anforderungen des deklarierten Ausdrucks erfüllen. Das Ausmaß, in dem eine Implementierung die Syntax der Variationen validiert, ist nicht spezifiziert.