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

履歴 編集

<set>

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

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

      template <class Key, class Compare = less<Key>, class Allocator = allocator<Key>>
      multiset(initializer_list<Key>, Compare = Compare(), Allocator = Allocator())
        -> multiset<Key, Compare, Allocator>;                                                 // (2)

      template <class InputIterator, class Allocator>
      multiset(InputIterator, InputIterator, Allocator)
        -> multiset<typename iterator_traits<InputIterator>::value_type,
               less<typename iterator_traits<InputIterator>::value_type>, Allocator>;         // (3)

      template <class Key, class Allocator>
      multiset(initializer_list<Key>, Allocator) -> multiset<Key, less<Key>, Allocator>;      // (4)

      template <ranges::input_range R, class Allocator>
      multiset(from_range_t, R&&, Allocator)
        -> multiset<ranges::range_value_t<R>, less<ranges::range_value_t<R>>, Allocator>;     // (5) C++23から
    }

## 概要

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

- (1) : イテレータ範囲からの推論
- (2) : 初期化子リストと比較関数オブジェクトからの推論
- (3) : イテレータ範囲とアロケータからの推論
- (4) : 初期化子リストとアロケータからの推論
- (5) : Rangeからの推論

## 例

    #include <set>
    #include <type_traits>
    #include <cassert>

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

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

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

### 出力

## バージョン

### 言語

- C++17

### 処理系

- Clang:
- GCC:
- Visual C++: ??

## 関連項目

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

## 参照

- P0433R2 Toward a resolution of US7 and US14: Integrating template deduction for class templates into the standard library