名稱空間
變體
操作

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 可以與另一個物件 t 進行比較,並隱式轉換為 basic_string_view<CharT,Traits>,其語義與比較 svbasic_string_view<CharT,Traits>(t) 相同。

(C++20 前)

三路比較運算子 (/*comp-cat*/) 的返回型別是 Traits::comparison_category(如果該限定 ID 表示一個型別),否則為 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 == "", "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++ 標準。

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