命名空间
变体
操作

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,否则为 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++ 标准。

DR 应用于 已发布的行为 正确行为
LWG 3432 C++20 operator<=> 的返回类型不需要是比较类别类型 需要
LWG 3950 C++20 仍然需要冗余的额外重载 重载集减少