Namespaces
Variants

std:: totally_ordered, std:: totally_ordered_with

From cppreference.net
Definiert im Header <concepts>
template < class T >

Konzept total_geordnet =

std:: equality_comparable < T > && __PartiallyOrderedWith < T, T > ;
(1) (seit C++20)
template < class T, class U >

Konzept totally_ordered_with =
std :: totally_ordered < T > &&
std :: totally_ordered < U > &&
std:: equality_comparable_with < T, U > &&
std :: totally_ordered <
std:: common_reference_t <
const std:: remove_reference_t < T > & ,
const std:: remove_reference_t < U > & >> &&

__PartiallyOrderedWith < T, U > ;
(2) (seit C++20)
Hilfskonzepte
template < class T, class U >

Konzept __PartiallyOrderedWith =
erfordert ( const std:: remove_reference_t < T > & t,
const std:: remove_reference_t < U > & u ) {
{ t < u } - > boolean-testable ;
{ t > u } - > boolean-testable ;
{ t <= u } - > boolean-testable ;
{ t >= u } - > boolean-testable ;
{ u < t } - > boolean-testable ;
{ u > t } - > boolean-testable ;
{ u <= t } - > boolean-testable ;
{ u >= t } - > boolean-testable ;

} ;
(3) ( Nur zur Darstellung* )
1) Das Konzept std::totally_ordered spezifiziert, dass die Vergleichsoperatoren ==,!=,<,>,<=,>= für einen Typ Ergebnisse liefern, die mit einer strengen Totalordnung auf dem Typ konsistent sind.
2) Das Konzept std::totally_ordered_with spezifiziert, dass die Vergleichsoperatoren ==,!=,<,>,<=,>= auf (möglicherweise gemischten) T und U Operanden Ergebnisse liefern, die mit einer strengen Totalordnung konsistent sind. Der Vergleich gemischter Operanden liefert Ergebnisse, die äquivalent zum Vergleich der in ihren gemeinsamen Typ konvertierten Operanden sind.
3) Das ausschließlich für die Darstellung verwendete Konzept __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.

Inhaltsverzeichnis

Semantische Anforderungen

Diese Konzepte sind nur modelliert, wenn sie erfüllt sind und alle Konzepte, die sie subsumieren, modelliert sind.

1) std :: totally_ordered < T > wird nur dann modelliert, wenn für Lvalues a , b und c vom Typ const std:: remove_reference_t < T > gilt:
  • 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 ) ebenfalls true ;
  • bool ( a > b ) == bool ( b < a )
  • bool ( a >= b ) == ! bool ( a < b )
  • bool ( a <= b ) == ! bool ( b < a )
2) std :: totally_ordered_with < T, U > is modeled only if, given

Sei C std:: common_reference_t < const std:: remove_reference_t < T > & , const std:: remove_reference_t < U > & > , und für einen Ausdruck E und einen Typ C sei CONVERT_TO < C > ( E ) definiert als:

(bis C++23)
  • static_cast < const C & > ( std:: as_const ( E ) ) falls dies ein gültiger Ausdruck ist,
  • static_cast < const C & > ( std :: move ( E ) ) andernfalls.
(seit C++23)

Folgendes trifft zu:

  • 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 ) )
**Anmerkung:** Da der gesamte Text innerhalb von ` ` Tags liegt (was Code-Formatierung entspricht) und gemäß Ihrer Anweisung Code nicht übersetzt werden soll, bleibt der gesamte Inhalt unverändert. Die HTML-Struktur und alle C++-spezifischen Begriffe wurden beibehalten.
3) __PartiallyOrderedWith < T, U > wird nur modelliert, wenn für

Folgendes zutrifft:

  • 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 ) .

Gleichheitserhaltung

Ausdrücke, die in requires expressions der Standardbibliothek-Konzepte deklariert werden, müssen equality-preserving sein (sofern nicht anders angegeben).

Implizite Ausdrucksvarianten

Ein requires -Ausdruck , der einen Ausdruck verwendet, der für einen konstanten Lvalue-Operanden nicht-modifizierend ist, erfordert ebenfalls implizite Ausdrucksvarianten .

Referenzen

  • C++23-Standard (ISO/IEC 14882:2024):
  • 18.5.5 Konzept totally_ordered [concept.totallyordered]
  • C++20-Standard (ISO/IEC 14882:2020):
  • 18.5.4 Konzept totally_ordered [concept.totallyordered]

Siehe auch

spezifiziert, dass der Operator <=> konsistente Ergebnisse für gegebene Typen liefert
(Konzept)