Namespaces
Variants

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

From cppreference.net
(Примечание: В данном фрагменте HTML отсутствует текстовое содержимое для перевода - присутствуют только HTML-теги и атрибуты, которые согласно инструкциям не подлежат переводу)
Определено в заголовке <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 ;
(начиная с C++17)
(до 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 ;
(начиная с 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) (начиная с C++17)
(до 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) (начиная с C++17)
(до 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) (начиная с C++17)
(до 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) (начиная с C++17)
(до 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) (начиная с C++17)
(до 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) (начиная с C++20)

Сравнивает два представления.

Все сравнения выполняются с помощью функции-члена compare() (которая сама определена в терминах Traits::compare() ):

  • Два представления равны, если размеры lhs и rhs равны и каждый символ в lhs имеет эквивалентный символ в rhs на той же позиции.
  • Сравнения упорядочивания выполняются лексикографически – сравнение производится функцией, эквивалентной std::lexicographical_compare .

Реализация предоставляет достаточное количество дополнительных constexpr и noexcept перегрузок этих функций, чтобы объект basic_string_view<CharT,Traits> sv мог быть сравнен с другим объектом t с неявным преобразованием в basic_string_view<CharT,Traits> , с семантикой, идентичной сравнению sv и basic_string_view<CharT,Traits>(t) .

(до C++20)

Возвращаемый тип операторов трёхстороннего сравнения ( /*comp-cat*/ ) является Traits :: comparison_category , если этот квалифицированный идентификатор обозначает тип, иначе std::weak_ordering . Если /*comp-cat*/ не является типом категории сравнения, программа некорректна.

Операторы < , <= , > , >= и != синтезируются из operator <=> и operator == соответственно.

(начиная с C++20)

Содержание

Параметры

lhs, rhs - сравниваемые представления

Возвращаемое значение

1-6) true если соответствующее сравнение выполняется, false в противном случае.
7) static_cast < /*comp-cat*/ > ( lhs. compare ( rhs ) <=> 0 ) .

Сложность

Линейно по размеру представлений.

Примечания

Достаточное количество дополнительных перегрузок может быть реализовано через невыводимый контекст в одном типе параметра.

(until C++20)

Тип результата трёхстороннего сравнения для std::string_view , std::wstring_view , std::u8string_view , std::u16string_view и std::u32string_view является std::strong_ordering .

std::type_identity_t используется для невыводимого контекста, что делает аргументы, неявно преобразуемые в тип string view, сравнимыми с string view.

(since C++20)

Пример

#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.");
}

Отчеты о дефектах

Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены ретроактивно к ранее опубликованным стандартам C++.

DR Применяется к Поведение в опубликованной версии Корректное поведение
LWG 3432 C++20 тип возвращаемого значения operator<=> не требовалось быть типом категории сравнения требуется
LWG 3950 C++20 избыточные дополнительные перегрузки всё ещё требовались набор перегрузок сокращён