名前空間
変種
操作

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

From 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()` を使って定義されています)。

  • `lhs` のサイズと `rhs` のサイズが等しく、`lhs` の各文字が `rhs` の同じ位置にある文字と等価である場合、2つのビューは等しいとみなされます。

実装では、`basic_string_view` オブジェクト `sv` が `basic_string_view` に暗黙的に変換可能な別のオブジェクト `t` と比較されたときに、`sv` と `basic_string_view(t)` を比較するのと同等の意味論を持つように、これらの関数の十分な追加の `constexpr` および `noexcept` オーバーロードが提供されます。

(C++20まで)

3項比較演算子(/*comp-cat*/)の戻り値の型は、その修飾IDが型を示す場合は Traits::comparison_category、それ以外の場合は std::weak_ordering です。/*comp-cat*/ が比較カテゴリ型でない場合、プログラムは不適格です。

<, <=, >, >=, != 演算子は、それぞれ operator<=>operator== から合成されます。

(C++20以降)

目次

[edit] パラメータ

lhs, rhs - 比較するビュー

[edit] 戻り値

1-6) 対応する比較が成り立つ場合は true、そうでない場合は false
7) static_cast</*comp-cat*/>(lhs.compare(rhs) <=> 0)

[edit] 計算量

ビューのサイズに対して線形。

[edit] 注記

推論されないコンテキストで十分な追加オーバーロードを実装できます。

(C++20まで)

std::string_view, std::wstring_view, std::u8string_view, std::u16string_view, std::u32string_view の3項比較の結果型は std::strong_ordering です。

std::type_identity_t は推論されないコンテキストに使用され、文字列ビュー型に暗黙的に変換可能な引数を文字列ビューと比較できるようにします。

(C++20以降)

[edit]

#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.");
}

[edit] 不具合報告

以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。

DR 適用対象 公開された動作 正しい動作
LWG 3432 C++20 operator<=> の戻り値の型は比較カテゴリ型である必要はありませんでした。 必要
LWG 3950 C++20 冗長な追加オーバーロードがまだ必要でした。 オーバーロードセットが縮小されました。
English 日本語 中文(简体) 中文(繁體)