最終更新日時: 2026年03月23日 19時49分31秒 (JST)
Raclamusi が更新

履歴 編集

<string>

# std::basic_string::推論補助(C++17)

    namespace std {
      template <class InputIterator,
                class Allocator = allocator<typename iterator_traits<InputIterator>::value_type>>
      basic_string(InputIterator, InputIterator, Allocator = Allocator())
        -> basic_string<typename iterator_traits<InputIterator>::value_type,
             char_traits<typename iterator_traits<InputIterator>::value_type>,
             Allocator>;                            // (1) C++17

      template <class CharT,
                class Traits,
                class Allocator = allocator<CharT>>
      explicit basic_string(basic_string_view<CharT, Traits>, const Allocator& = Allocator())
        -> basic_string<CharT, Traits, Allocator>;  // (2) C++20

      template <class CharT,
                class Traits,
                class Allocator = allocator<CharT>>
      basic_string(basic_string_view<CharT, Traits>,
                   typename see below::size_type,
                   typename see below::size_type,
                   const Allocator& = Allocator())
        -> basic_string<CharT, Traits, Allocator>;  // (3) C++20

      template <ranges::input_range R,
                class Allocator = allocator<ranges::range_value_t<R>>>
      basic_string(from_range_t, R&&, Allocator = Allocator())
        -> basic_string<ranges::range_value_t<R>,
                        char_traits<ranges::range_value_t<R>>,
                        Allocator>;                 // (4) C++23
    }

## 概要

`std::basic_string`クラステンプレートの型推論補助。

- (1) : イテレータ範囲からの推論
- (2) : string_viewからの推論
- (3) : string_viewとpos, countからの推論
- (4) : Rangeからの推論

## 備考

- (3) : `size_type`は、推論された`basic_string`型のメンバ型

## 例

    #include <string>
    #include <string_view>
    #include <type_traits>

    using namespace std::string_view_literals;

    int main()
    {
      // 文字列リテラルからの推論
      std::basic_string s1 = "Hello";
      static_assert(std::is_same_v<decltype(s1), std::basic_string<char>>);

      // パラメータ設定済みbasic_stringからの推論
      std::string s2_org = "Hello";
      std::basic_string s2 = s2_org;
      static_assert(std::is_same_v<decltype(s2), std::basic_string<char>>);

      // 文字をN回繰り返すコンストラクタからの推論
      std::basic_string s3 {3, 'a'};
      static_assert(std::is_same_v<decltype(s3), std::basic_string<char>>);

      // 初期化子リストからの推論
      std::basic_string s4 = {'H', 'e', 'l', 'l', 'o'};
      static_assert(std::is_same_v<decltype(s4), std::basic_string<char>>);

      // イテレータ範囲からの推論。
      // {s1.begin(), s1.end()} とすると、イテレータの初期化子リストと見なされてしまい、
      // basic_string<decltype(s1)::iterator>型に推論されてしまうので注意
      std::basic_string s5(s1.begin(), s1.end());
      static_assert(std::is_same_v<decltype(s5), std::basic_string<char>>);

      // string_viewからの推論
      // explicit なので ="Hello"sv とはできない
      std::basic_string s6("Hello"sv);
      static_assert(std::is_same_v<decltype(s6), std::basic_string<char>>);
    }

### 出力

## バージョン

### 言語

- C++17

### 処理系

- Clang: 7.0 ✅
- GCC: 8.1 ✅
- Visual C++: ??

## 関連項目

- C++17 クラステンプレートのテンプレート引数推論

## 参照

- P0433R2 Toward a resolution of US7 and US14: Integrating template deduction for class templates into the standard library
- LWG Issue 3075. `basic_string` needs deduction guides from `basic_string_view`