最終更新日時(UTC): 2025年07月11日 17時16分44秒
Koichi Murase が更新

履歴 編集

<list>

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

    namespace std {
      template <class InputIterator,
                class Allocator = allocator<typename iterator_traits<InputIterator>::value_type>>
      list(InputIterator, InputIterator, Allocator = Allocator())
        -> list<typename iterator_traits<InputIterator>::value_type, Allocator>; // (1)

      template <ranges::input_range R,
                class Allocator = allocator<ranges::range_value_t<R>>>
      list(from_range_t, R&&, Allocator = Allocator())
        -> list<ranges::range_value_t<R>, Allocator>;                            // (2) C++23から
    }

## 概要

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

- (1) : イテレータ範囲から推論する。
- (2) : Rangeから推論する。

## 例

    #include <list>
    #include <type_traits>
    #include <cassert>

    int main()
    {
      // 初期化子リストから推論
      std::list ls1 = {1, 2, 3};
      static_assert(std::is_same_v<decltype(ls1), std::list<int>>);

      // パラメータ設定済みのlistからの推論
      std::list ls2 = ls1;
      static_assert(std::is_same_v<decltype(ls2), std::list<int>>);

      // 値1を3回繰り返すコンストラクタからの推論。
      // ls3{3, 1} とすると初期化子リストと見なされてしまうので注意
      std::list ls3(3, 1);
      static_assert(std::is_same_v<decltype(ls3), std::list<int>>);
      assert(ls3.size() == 3);

      // イテレータ範囲からの推論。
      // ls4{ls1.begin(), ls1.end()} とすると、イテレータの初期化子リストと見なされてしまうので注意
      std::list ls4(ls1.begin(), ls1.end());
      static_assert(std::is_same_v<decltype(ls4), std::list<int>>);
      assert(ls4.size() == 3);
    }

### 出力

## バージョン

### 言語

- C++17

### 処理系

- Clang:
- 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