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

從 cppreference.com


 
 
 
 
在標頭 <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() 定義):

  • lhsrhs 的大小相等且 lhs 中每個字符等價於 rhs 在同一位置的字符,則兩個視圖相等。

實現對這些函數提供充足的額外 constexprnoexcept 重載,以令 basic_string_view<CharT,Traits> 對象 sv 可以與另一帶隱式轉換成 basic_string_view<CharT,Traits> 的對象 t 比較,而且語義上與比較 svbasic_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_viewstd::wstring_viewstd::u8string_viewstd::u16string_viewstd::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 == "", "C++20 前选择额外的重载。");
 
    static_assert("" == ""sv, "C++20 前选择额外的重载。C++20 起使用重写候选。");
 
    static_assert(!(""sv != ""sv), "C++20 起使用重写候选。");
 
    static_assert(!(""sv != ""), "C++20 前选择额外的重载;C++20 起使用重写候选。");
 
    static_assert(!("" != ""sv), "C++20 前选择额外的重载;C++20 起使用重写候选。");
}

[編輯] 缺陷報告

下列更改行為的缺陷報告追溯地應用於以前出版的 C++ 標準。

缺陷報告 應用於 出版時的行為 正確行為
LWG 3432 C++20 未要求 operator<=> 的返回類型為比較類別類型 已要求
LWG 3950 C++20 仍然要求冗餘的額外重載 減小重載集