最終更新日時: 2026年02月17日 23時22分33秒 (JST)
Akira Takahashi が更新

履歴 編集

function template
<queue>

# std::queue::emplace(C++11)

    template <class... Args>
    void emplace(Args&&... args);                     // (1) C++11
    template <class... Args>
    decltype(auto) emplace(Args&&... args);           // (1) C++17
    template <class... Args>
    constexpr decltype(auto) emplace(Args&&... args); // (1) C++26

## 概要

要素型 `value_type` のコンストラクタ引数をとり、直接構築でキューに要素を追加する。

## 効果

- C++14 まで

      c.emplace_back(std::forward<Args>(args)...);

- C++17 から

      return c.emplace_back(std::forward<Args>(args)...);

## 戻り値

- C++14 まで：なし
- C++17 から：構築した要素への参照

## 例

    #include <iostream>
    #include <queue>
    #include <string>
    #include <utility>

    int main()
    {
      std::queue<std::pair<int, std::string>> que;

      que.emplace(3, "aaa");
      que.emplace(1, "bbb");
      que.emplace(4, "ccc");

      while (!que.empty()) {
        std::cout << que.front().first << ", " << que.front().second << std::endl;
        que.pop();
      }
    }

### 出力

    3, aaa
    1, bbb
    4, ccc

## バージョン

### 言語

- C++11

### 処理系

- Clang: ??
- GCC: 4.7.0 ✅
- ICC: ??
- Visual C++:

### 備考

C++17 規格が発行された段階では戻り値型が `reference` に変更されていたが、そうしてしまうと `emplace_back` が参照を返さないコンテナと共に使用している既存のコードを破壊してしまうため、規格の誤りとして戻り値型が更に `decltype(auto)` に変更された。

## 関連項目

名前 | 説明
--- | ---
`push` | 要素を追加する

## 参照

- N2680 Proposed Wording for Placement Insert (Revision 1)
- P0084R0 Emplace Return Type
- P0084R1 Emplace Return Type (Revision 1)
- P0084R2 Emplace Return Type (Revision 2)
- LWG Issue 2783. stack::emplace() and queue::emplace() should return decltype(auto)
- P3372R3 constexpr containers and adaptors