最終更新日時: 2025年01月08日 16時42分08秒 (JST)
Akira Takahashi が更新

履歴 編集

function
<string_view>

# std::string_view_literals::svリテラル(C++17)

    namespace std {

    inline namespace literals {
    inline namespace string_view_literals {
      constexpr std::string_view    operator""sv(const char* str, std::size_t len) noexcept;     // (1)
      constexpr std::u8string_view  operator""sv(const char8_t* str, std::size_t len) noexcept;  // (2) C++20
      constexpr std::u16string_view operator""sv(const char16_t* str, std::size_t len) noexcept; // (3)
      constexpr std::u32string_view operator""sv(const char32_t* str, std::size_t len) noexcept; // (4)
      constexpr std::wstring_view   operator""sv(const wchar_t* str, std::size_t len) noexcept;  // (5)
    }}

    }

## 概要

`basic_string_view`型のリテラル。

文字列リテラルを受け取り、各文字型の`basic_string_view`オブジェクトを構築する。

- (1) : `string_view`型のリテラル
- (2) : `u8string_view`型のリテラル
- (3) : `u16string_view`型のリテラル
- (4) : `u32string_view`型のリテラル
- (5) : `wstring_view`型のリテラル

## 戻り値

- (1) : `string_view{str, len}`
- (2) : `u8string_view{str, len}`
- (3) : `u16string_view{str, len}`
- (4) : `u32string_view{str, len}`
- (5) : `wstring_view{str, len}`

## 備考

- 中間にヌル文字を含む文字列リテラルから`basic_string_view`オブジェクトを構築する場合、コンストラクタを使用するよりもこちらの関数を使用したほうがよい。
  - `const char*`をとるコンストラクタは`std::char_traits::length()`関数を使用して文字列長を計算するため、ヌル終端までの長さとなる。そのコンストラクタでは文字列の途中にヌル文字がある場合、文字列の終端まで扱われないので注意が必要となる
  - こちらの関数は文字列リテラルの長さを直接扱うため、文字列全体を参照する`basic_string_view`オブジェクトを構築できる

        // コンストラクタは、ヌル文字までの長さ
        const char* s = "123\0abc";
        auto sv0 = std::string_view{s};
        assert(sv0.length() == 3); // "123"

        // svリテラルは全体の長さ
        auto sv1 = "123\0abc"sv;
        assert(sv1.length() == 7); // "123\0abc"

## 例

    #include <iostream>
    #include <string_view>
    #include <type_traits>

    int main()
    {
      using namespace std::string_view_literals;

      auto sv1 = "Hello"sv;   // sv1の型はstd::string_view
      auto sv2 = u8"Hello"sv; // sv2の型はstd::string_view(C++17)/std::u8string_view(C++20)
      auto sv3 = u"Hello"sv;  // sv3の型はstd::u16string_view
      auto sv4 = U"Hello"sv;  // sv4の型はstd::u32string_view
      auto sv5 = L"Hello"sv;  // sv5の型はstd::wstring_view

      std::cout << sv1.substr(0, 3) << std::endl;

      static_assert(std::is_same<decltype(sv1), std::string_view>{});
    #if defined(__cpp_char8_t) && 201803L <= __cpp_char8_t
      static_assert(std::is_same<decltype(sv2), std::u8string_view>{});
    #else
      static_assert(std::is_same<decltype(sv2), std::string_view>{});
    #endif
      static_assert(std::is_same<decltype(sv3), std::u16string_view>{});
      static_assert(std::is_same<decltype(sv4), std::u32string_view>{});
      static_assert(std::is_same<decltype(sv5), std::wstring_view>{});
    }

### 出力

    Hel

## バージョン

### 言語

- C++17

### 処理系

- Clang: 4.0 ✅
- GCC: 7.1 ✅
- ICC: ??
- Visual C++: ??

## 参照

- 文字列リテラルからの`std::string_view`構築 - yohhoyの日記