最終更新日時: 2026年07月22日 13時44分46秒 (JST)
rotarymars が更新

履歴 編集

<queue>

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

    namespace std {
      // 説明用の型
      template <class InputIterator>
      using iter_val_t = typename iterator_traits<InputIterator>::value_type;

    template <class Compare, class Container>
      priority_queue(Compare, Container)
        -> priority_queue<typename Container::value_type, Container, Compare>; // (1)

      template <class InputIterator,
                class Compare = less<iter_val_t<InputIterator>>,
                class Container = std::vector<iter_val_t<InputIterator>>>
      priority_queue(InputIterator, InputIterator, Compare = Compare(), Container = Container())
        -> priority_queue<iter_val_t<InputIterator>, Container, Compare>;      // (2)

      template <ranges::input_range R, class Compare = less<ranges::range_value_t<R>>>
      priority_queue(from_range_t, R&&, Compare = Compare())
        -> priority_queue<ranges::range_value_t<R>,
                          vector<ranges::range_value_t<R>>, Compare>;          // (3) C++23から

      template <class Compare, class Container, class Allocator>
      priority_queue(Compare, Container, Allocator)
        -> priority_queue<typename Container::value_type, Container, Compare>; // (4)

      template <class InputIterator, class Allocator>
      priority_queue(InputIterator, InputIterator, Allocator)
        -> priority_queue<iter_val_t<InputIterator>,
                          vector<iter_val_t<InputIterator>, Allocator>,
                          less<iter_val_t<InputIterator>>>;                    // (5) C++23から

      template <class InputIterator, class Compare, class Allocator>
      priority_queue(InputIterator, InputIterator, Compare, Allocator)
        -> priority_queue<iter_val_t<InputIterator>,
                          vector<iter_val_t<InputIterator>, Allocator>,
                          Compare>;                                            // (6) C++23から

      template <class InputIterator, class Compare, class Container, class Allocator>
      priority_queue(InputIterator, InputIterator, Compare, Container, Allocator)
        -> priority_queue<typename Container::value_type, Container, Compare>; // (7) C++23から

      template <ranges::input_range R, class Compare, class Allocator>
      priority_queue(from_range_t, R&&, Compare, Allocator)
        -> priority_queue<ranges::range_value_t<R>,
                          vector<ranges::range_value_t<R>, Allocator>,
                          Compare>;                                            // (8) C++23から

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

## 概要

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

- (1) : 比較関数オブジェクトと、元となるコンテナから推論する
- (2) : イテレータ範囲、比較関数オブジェクト、元となるコンテナから推論する
- (3) : Rangeと比較関数オブジェクトから推論する
- (4) : 比較関数オブジェクトと、元となるコンテナ、アロケータから推論する
- (5) : イテレータ範囲とアロケータから推論する
- (6) : イテレータ範囲、比較関数オブジェクト、アロケータから推論する
- (7) : イテレータ範囲、比較関数オブジェクト、元となるコンテナ、アロケータから推論する
- (8) : Range、比較関数オブジェクト、元となるコンテナから推論する
- (9) : Rangeとアロケータから推論する

## 適格要件

以下のいずれかの条件を満たす場合、コンテナアダプタの推論補助はオーバーロード解決に参加しない：

- `InputIterator`テンプレートパラメータをもち、入力イテレータの要件を満たさない型が推論された場合
- `Compare`テンプレートパラメータをもち、アロケータとして適格な型が推論された場合 (C++23)
- `Container`テンプレートパラメータをもち、アロケータとして適格な型が推論された場合 (C++23)
- `Container`テンプレートパラメータをもたず、`Allocator`テンプレートパラメータをもち、アロケータとして適格でない型が推論された場合 (C++23)
- `Container`と`Allocator`の両方のテンプレートパラメータをもち、`uses_allocator_v<Container, Allocator>`が`false`の場合

## 例

    #include <queue>
    #include <type_traits>
    #include <vector>

    int main()
    {
      std::vector v = {1, 2, 3};

      // (1)
      // 比較関数オブジェクトと、元となるコンテナから推論
      std::priority_queue pque1 {std::less<int>(), v};
      static_assert(std::is_same_v<decltype(pque1), std::priority_queue<int>>);

      // (2)
      // イテレータ範囲から推論 (デフォルトのコンテナを使用する)
      std::priority_queue pque2 {v.begin(), v.end()};
      static_assert(std::is_same_v<decltype(pque2), std::priority_queue<int>>);
    }

### 出力

## バージョン

### 言語

- 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
- P1518R2 Stop Overconstraining Allocators in Container Deduction Guides
  - C++23での推論補助の制約についての変更