Namespaces
Variants

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

Материал из ru.cppreference.net
 
 
 
std::basic_string_view
Функции-элементы
Итераторы
Вместимость
Операции
 
Определён в заголовочном файле <string_view>
template< class CharT, class Traits >
constexpr bool operator==( std::basic_string_view<CharT,Traits> lhs,
                           std::basic_string_view<CharT,Traits> rhs ) noexcept;
(1) (начиная с 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 избыточные дополнительные перегрузки всё ещё требовались набор перегрузок сокращён