Namensräume
Varianten
Aktionen

std::experimental::ranges::equal_to

Von cppreference.com
< cpp‎ | experimental‎ | ranges
 
 
 
 
Allgemeine Dienstprogramme-Bibliothek
Hilfskomponenten
Funktionsobjekte
equal_to
Metaprogrammierung und Typ-Traits
Getaggte Paare und Tupel
                          
Tag-Spezifizierer
                                      
                          
 
template< class T = void >

    erfordert EqualityComparable<T> ||
             Same<T, void> ||
             /* == für zwei const T Lvalues ruft einen eingebauten Operator auf, der Zeiger vergleicht */

struct equal_to;
(Ranges TS)
template<>
struct equal_to<void>;
(Ranges TS)

Funktionsobjekt zur Durchführung von Vergleichen. Die primäre Vorlage ruft operator == für const Lvalues vom Typ T auf. Die Spezialisierung equal_to<void> leitet die Parametertypen des Funktionsaufrufoperators aus den Argumenten ab (nicht jedoch den Rückgabetyp).

Alle Spezialisierungen von equal_to sind Semiregular.

Inhalt

[bearbeiten] Member-Typen

Mitgliedertyp Definition
is_transparent (nur Mitglied der Spezialisierung equal_to<void>) /* nicht spezifiziert */

[bearbeiten] Member-Funktionen

operator()
prüft, ob die Argumente gleich sind
(öffentliche Memberfunktion)

std::experimental::ranges::equal_to::operator()

constexpr bool operator()(const T& x, const T& y) const;
(1) (nur Mitglied der primären Vorlage equal_to<T>)
template< class T, class U >

    erfordert EqualityComparableWith<T, U> ||
             /* std::declval<T>() == std::declval<U>() wird aufgelöst zu
               einem eingebauten Operator, der Zeiger vergleicht */

constexpr bool operator()(T&& t, U&& u) const;
(2) (nur Mitglied der Spezialisierung equal_to<void>)
1) Vergleicht x und y. Äquivalent zu return ranges::equal_to<>{}(x, y);.
2) Vergleicht t und u. Äquivalent zu return std::forward<T>(t) == std::forward<U>(u);, außer wenn dieser Ausdruck zu einem Aufruf eines eingebauten operator == aufgelöst wird, der Zeiger vergleicht.

Wenn ein Aufruf von (1) oder (2) einen eingebauten Operator aufrufen würde, der Zeiger vom Typ P vergleicht, wird das Ergebnis stattdessen wie folgt bestimmt:

  • Gibt false zurück, wenn der (möglicherweise konvertierte) Wert des ersten Arguments und der (möglicherweise konvertierte) Wert des zweiten Arguments in der implementierungsdefinierten strengen Totalordnung über alle Zeigerwerte vom Typ P voneinander vorrangig sind. Diese strenge Totalordnung ist konsistent mit der partiellen Ordnung, die durch die eingebauten Operatoren <, >, <= und >= auferlegt wird.
  • Andernfalls (keines ist vorrangig vor dem anderen), gibt true zurück.

Das Verhalten ist undefiniert, es sei denn, die Konvertierungssequenzen von sowohl T als auch U nach P sind gleichheitserhaltend (siehe unten).

[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.

[bearbeiten] Hinweise

Im Gegensatz zu std::equal_to erfordert ranges::equal_to, dass sowohl == als auch != gültig sind (über die Beschränkungen EqualityComparable und EqualityComparableWith).

[bearbeiten] Beispiel

[bearbeiten] Siehe auch

Funktions-Objekt, das x == y implementiert
(Klassen-Template) [bearbeiten]