Spec-Zone.ru › C++

operator==,!=,<,<=,>,>=,<=>(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).

Сложность

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

Примечания

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

(до C++20)

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

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

(начиная с 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 дополнительные избыточные перегрузки по-прежнему требовались наборы перегрузок сокращены

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/string/basic_string_view/operator_cmp

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API