Namensräume
Varianten
Aktionen

operator==,!=,<,<=,>,>=,<=>(std::basic_string_view)

Von cppreference.com
 
 
 
 
Definiert in Header <string_view>
(1)
template< class CharT, class Traits >

constexpr bool operator==( std::basic_string_view<CharT,Traits> lhs,

                           std::basic_string_view<CharT,Traits> rhs ) noexcept;
(seit C++17)
(bis C++20)
template< class CharT, class Traits >

constexpr bool operator==(
    std::basic_string_view<CharT,Traits> lhs,

    std::type_identity_t<std::basic_string_view<CharT,Traits>> rhs ) noexcept;
(seit C++20)
template< class CharT, class Traits >

constexpr bool operator!==( std::basic_string_view<CharT,Traits> lhs,

                           std::basic_string_view<CharT,Traits> rhs ) noexcept;
(2) (seit C++17)
(bis C++20)
template< class CharT, class Traits >

constexpr bool operator<( std::basic_string_view<CharT,Traits> lhs,

                          std::basic_string_view<CharT,Traits> rhs ) noexcept;
(3) (seit C++17)
(bis C++20)
template< class CharT, class Traits >

constexpr bool operator<=( std::basic_string_view<CharT,Traits> lhs,

                           std::basic_string_view<CharT,Traits> rhs ) noexcept;
(4) (seit C++17)
(bis C++20)
template< class CharT, class Traits >

constexpr bool operator>( std::basic_string_view<CharT,Traits> lhs,

                          std::basic_string_view<CharT,Traits> rhs ) noexcept;
(5) (seit C++17)
(bis C++20)
template< class CharT, class Traits >

constexpr bool operator>=( std::basic_string_view<CharT,Traits> lhs,

                           std::basic_string_view<CharT,Traits> rhs ) noexcept;
(6) (seit C++17)
(bis C++20)
template< class CharT, class Traits >

constexpr /*comp-cat*/ operator<=>(
    std::basic_string_view<CharT,Traits> lhs,

    std::type_identity_t<std::basic_string_view<CharT,Traits>> rhs ) noexcept;
(7) (seit C++20)

Vergleicht zwei Ansichten.

Alle Vergleiche erfolgen über die Memberfunktion compare() (die selbst in Bezug auf Traits::compare() definiert ist)

  • Zwei Ansichten sind gleich, wenn sowohl die Größe von lhs als auch von rhs gleich ist und jedes Zeichen in lhs ein äquivalentes Zeichen in rhs an derselben Position hat.
  • Die Ordnungsvergleiche erfolgen lexikographisch – der Vergleich wird von einer Funktion durchgeführt, die äquivalent zu std::lexicographical_compare ist.

Die Implementierung stellt ausreichende zusätzliche constexpr- und noexcept-Überladungen dieser Funktionen bereit, sodass ein basic_string_view<CharT,Traits>-Objekt sv mit einem anderen Objekt t verglichen werden kann, das eine implizite Konvertierung in basic_string_view<CharT,Traits> zulässt, mit denselben Semantiken wie der Vergleich von sv und basic_string_view<CharT,Traits>(t).

(bis C++20)

Der Rückgabetyp von Drei-Wege-Vergleichsoperatoren (/*comp-cat*/) ist Traits::comparison_category, wenn dieser qualifizierte Bezeichner einen Typ bezeichnet, andernfalls std::weak_ordering. Wenn /*comp-cat*/ kein Vergleichskategorietyp ist, ist das Programm schlecht geformt.

Die Operatoren <, <=, >, >= und != sind synthetisiert aus operator<=> und operator== beziehungsweise.

(seit C++20)

Inhalt

[edit] Parameter

lhs, rhs - zu vergleichende Ansichten

[edit] Rückgabewert

1-6) true, wenn der entsprechende Vergleich zutrifft, andernfalls false.
7) static_cast</*comp-cat*/>(lhs.compare(rhs) <=> 0).

[edit] Komplexität

Linear bezüglich der Größe der Ansichten.

[edit] Hinweise

Ausreichende zusätzliche Überladungen können durch einen nicht ableitbaren Kontext in einem Parameter-Typ implementiert werden.

(bis C++20)

Der Drei-Wege-Vergleichsergebnistyp von std::string_view, std::wstring_view, std::u8string_view, std::u16string_view und std::u32string_view ist std::strong_ordering.

std::type_identity_t wird für den nicht ableitbaren Kontext verwendet, wodurch Argumente, die implizit in den String-View-Typ konvertierbar sind, mit dem String-View verglichen werden können.

(seit C++20)

[edit] Beispiel

#include <string_view>
 
int main()
{
    using namespace std::literals;
 
    static_assert(""sv == ""sv);
 
    static_assert(""sv == "", "Selects an additional overload until C++20.");
 
    static_assert("" == ""sv, "Selects an additional overload until C++20."
                              "Uses a rewritten candidate since C++20.");
 
    static_assert(!(""sv != ""sv), "Uses the rewritten candidate since C++20.");
 
    static_assert(!(""sv != ""), "Selects an additional overload until C++20;"
                                 "Uses a rewritten candidate since C++20.");
 
    static_assert(!("" != ""sv), "Selects an additional overload until C++20."
                                 "Uses a rewritten candidate since C++20.");
}

[edit] Fehlerberichte

Die folgenden Verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.

DR angewendet auf Verhalten wie veröffentlicht Korrigiertes Verhalten
LWG 3432 C++20 Der Rückgabetyp von operator<=> musste nicht zwingend ein Vergleichskategorietyp sein Gefordert
LWG 3950 C++20 redundante zusätzliche Überladungen waren immer noch erforderlich Überladungssätze reduziert