Namespaces
Variants

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

From cppreference.net
定义于头文件 <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() 定义):

  • 当且仅当 lhs rhs 的大小相等,且 lhs 中的每个字符在相同位置上都与 rhs 中的对应字符等价时,两个视图才被视为相等。

该实现提供了这些函数足够多的额外 constexpr noexcept 重载,使得 basic_string_view<CharT,Traits> 对象 sv 可与另一个能隐式转换为 basic_string_view<CharT,Traits> 的对象 t 进行比较,其语义等同于比较 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 ) .

复杂度

与视图大小呈线性关系。

备注

通过在一个参数类型中使用非推导上下文,可以实现足够的额外重载。

(until C++20)

std::string_view std::wstring_view std::u8string_view std::u16string_view std::u32string_view 的三路比较结果类型为 std::strong_ordering

使用 std::type_identity_t 实现非推导上下文,使得可隐式转换为字符串视图类型的实参能够与字符串视图进行比较。

(since 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 仍然要求存在冗余的额外重载 重载集合已精简