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

来自cppreference.com


 
 
 
 
在标头 <string_view> 定义
(1)
template<class CharT, class Traits >

constexprbool 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 >

constexprbool 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 >

constexprbool 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 >

constexprbool 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 >

constexprbool 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 >

constexprbool 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 >

constexprbool 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(){usingnamespace 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 仍然要求冗余的额外重载 减小重载集
close