77
88``` cpp
99template <class ... Args>
10- pair<iterator, bool> try_emplace(const key_type& k, Args&&... args); // (1)
10+ pair<iterator, bool>
11+ try_emplace(const key_type& k, Args&&... args); // (1) C++17
1112
1213template <class... Args>
13- pair<iterator, bool> try_emplace(key_type&& k, Args&&... args); // (2)
14+ pair<iterator, bool>
15+ try_emplace(key_type&& k, Args&&... args); // (2) C++17
1416
1517template <class... Args>
16- iterator try_emplace(const_iterator hint, const key_type& k, Args&&... args); // (3)
18+ iterator
19+ try_emplace(const_iterator hint,
20+ const key_type& k,
21+ Args&&... args); // (3) C++17
1722
1823template <class... Args>
19- iterator try_emplace(const_iterator hint, key_type&& k, Args&&... args); // (4)
24+ iterator
25+ try_emplace(const_iterator hint,
26+ key_type&& k,
27+ Args&&... args); // (4) C++17
28+
29+ template <class K, class... Args>
30+ pair<iterator, bool>
31+ try_emplace(K&& k, Args&&... args); // (5) C++26
32+
33+ template <class K, class... Args>
34+ iterator
35+ try_emplace(const_iterator hint,
36+ K&& k,
37+ Args&&... args); // (6) C++26
2038```
2139* pair[link /reference/utility/pair.md]
2240
@@ -32,44 +50,43 @@ iterator try_emplace(const_iterator hint, key_type&& k, Args&&... args);
3250- (2) : 指定された一時オブジェクトのキーが存在しない場合に、要素を直接構築で挿入する
3351- (3) : キーを検索するヒントを指定し、指定されたキーが存在しない場合に、要素を直接構築で挿入する
3452- (4) : キーを検索するヒントを指定し、指定された一時オブジェクトのキーが存在しない場合に、要素を直接構築で挿入する
53+ - (5) : `key_type`型と比較可能なキーが存在しない場合に、要素を直接構築で挿入する
54+ - (6) : キーを検索するヒントを指定し、指定された`key_type`型と比較可能なキーが存在しない場合に、要素を直接構築で挿入する
3555
3656
3757## テンプレートパラメータ制約
38- - (1)、(3) : `value_type` は、[`piecewise_construct`](/reference/utility/piecewise_construct_t.md), [`forward_as_tuple`](/reference/tuple/forward_as_tuple.md)`(k)`, [`forward_as_tuple`](/reference/tuple/forward_as_tuple.md)`(`[`forward`](/reference/utility/forward.md)`<Args>(args)...)` から `map` に直接構築可能であること
39- - (2)、(4) : `value_type` は、[`piecewise_construct`](/reference/utility/piecewise_construct_t.md), [`forward_as_tuple`](/reference/tuple/forward_as_tuple.md)`(`[`move`](/reference/utility/move.md)`(k))`, [`forward_as_tuple`](/reference/tuple/forward_as_tuple.md)`(`[`forward`](/reference/utility/forward.md)`<Args>(args)...)` から `map` に直接構築可能であること
58+ - (1)、(3)、(5) : `value_type` は、[`piecewise_construct`](/reference/utility/piecewise_construct_t.md), [`forward_as_tuple`](/reference/tuple/forward_as_tuple.md)`(k)`, [`forward_as_tuple`](/reference/tuple/forward_as_tuple.md)`(`[`forward`](/reference/utility/forward.md)`<Args>(args)...)` から `map` に直接構築可能であること
59+ - (2)、(4)、(6) : `value_type` は、[`piecewise_construct`](/reference/utility/piecewise_construct_t.md), [`forward_as_tuple`](/reference/tuple/forward_as_tuple.md)`(`[`move`](/reference/utility/move.md)`(k))`, [`forward_as_tuple`](/reference/tuple/forward_as_tuple.md)`(`[`forward`](/reference/utility/forward.md)`<Args>(args)...)` から `map` に直接構築可能であること
60+ - (5), (6) : `key_compare::is_transparent` が妥当な式であること
4061
4162なお、規格に記載はないが、`hint` は [`emplace_hint`](emplace_hint.md) と同様、コンテナの有効な読み取り専用イテレータである必要があるものと思われる。
4263
4364
4465## 効果
45- - (1)、(3) : `map` が `k` と同値のキーを持つ要素を持っている場合、何もしない(引数への副作用もない)。そうでなければ、[`piecewise_construct`](/reference/utility/piecewise_construct_t.md), [`forward_as_tuple`](/reference/tuple/forward_as_tuple.md)`(k)`, [`forward_as_tuple`](/reference/tuple/forward_as_tuple.md)`(`[`forward`](/reference/utility/forward.md)`<Args>(args)...)` から構築した `value_type` 型のオブジェクトを挿入する。
46- - (2)、(4) : `map` が `k` と同値のキーを持つ要素を持っている場合、何もしない(引数への副作用もない)。そうでなければ、[`piecewise_construct`](/reference/utility/piecewise_construct_t.md), [`forward_as_tuple`](/reference/tuple/forward_as_tuple.md)`(`[`move`](/reference/utility/move.md)`(k))`, [`forward_as_tuple`](/reference/tuple/forward_as_tuple.md)`(`[`forward`](/reference/utility/forward.md)`<Args>(args)...)` から構築した `value_type` 型のオブジェクトを挿入する。
66+ - (1)、(3)、(5) : `map` が `k` と同値のキーを持つ要素を持っている場合、何もしない(引数への副作用もない)。そうでなければ、[`piecewise_construct`](/reference/utility/piecewise_construct_t.md), [`forward_as_tuple`](/reference/tuple/forward_as_tuple.md)`(k)`, [`forward_as_tuple`](/reference/tuple/forward_as_tuple.md)`(`[`forward`](/reference/utility/forward.md)`<Args>(args)...)` から構築した `value_type` 型のオブジェクトを挿入する。
67+ - (2)、(4)、(6) : `map` が `k` と同値のキーを持つ要素を持っている場合、何もしない(引数への副作用もない)。そうでなければ、[`piecewise_construct`](/reference/utility/piecewise_construct_t.md), [`forward_as_tuple`](/reference/tuple/forward_as_tuple.md)`(`[`move`](/reference/utility/move.md)`(k))`, [`forward_as_tuple`](/reference/tuple/forward_as_tuple.md)`(`[`forward`](/reference/utility/forward.md)`<Args>(args)...)` から構築した `value_type` 型のオブジェクトを挿入する。
4768
4869
4970## 戻り値
50- - (1)、(2) : イテレータと `bool` 値の [`pair`](/reference/utility/pair.md) を返す。
71+ - (1)、(2)、(5) : イテレータと `bool` 値の [`pair`](/reference/utility/pair.md) を返す。
5172 - 挿入された場合には、`first` に挿入された要素へのイテレータ、`second` に `true` が設定される。
5273 - 挿入されなかった場合には、`first` に `k` と等価のキーを持つ既存の要素へのイテレータ、`second` に `false` が設定される。
53- - (3)、(4) :
74+ - (3)、(4)、(6) :
5475 - 挿入された場合には、挿入された要素へのイテレータを返す。
5576 - 挿入されなかった場合には、`k` と等価のキーを持つ既存の要素へのイテレータを返す。
5677
5778
5879## 計算量
59- - (1)、(2) : [`emplace`](emplace.md) と同じ。
60- - (3)、(4) : [`emplace_hint`](emplace_hint.md) と同じ。
80+ - (1)、(2)、(5) : [`emplace`](emplace.md) と同じ。
81+ - (3)、(4)、(6) : [`emplace_hint`](emplace_hint.md) と同じ。
6182
6283
6384## 備考
6485- 概要に記載されているように、本メンバ関数は指定されたキーと等価の要素が既に存在する場合には、引数に副作用が発生しない。
65- 一方、[`emplace`](emplace.md)、[`emplace_hint`](emplace_hint.md)、[`insert`](insert.md) にはそのような規定は無く、挿入がされなかった場合でも引数に副作用(引数からのムーブ)が発生してしまう可能性があるため、注意が必要である。
66-
67- - このメンバ関数の機能テストマクロは以下の通り。
68-
69- | マクロ名 | 値 |
70- |-----------------------------|----------|
71- | `__cpp_lib_map_try_emplace` | `201411` |
72-
86+ - 一方、[`emplace`](emplace.md)、[`emplace_hint`](emplace_hint.md)、[`insert`](insert.md) にはそのような規定は無く、挿入がされなかった場合でも引数に副作用(引数からのムーブ)が発生してしまう可能性があるため、注意が必要である。
87+ - (5), (6) :
88+ - `is_transparent`は、標準ライブラリの[`std::less`](/reference/functional/less.md)、[`std::greater`](/reference/functional/greater.md)といった関数オブジェクトの、`void`に対する特殊化で定義される。それ以外のテンプレートパラメータで`is_transparent`が定義されないのは、互換性のためである。
89+ - これらのオーバーロードは、`map<string, int>`のようなコンテナに対し、検索操作で文字列リテラルを渡した際に、キー型の一時オブジェクトが生成されるコストを減らすためにある。
7390
7491
7592## 例
@@ -129,3 +146,5 @@ false, 114, false
129146- [ N4006 An improved emplace() for unique-key maps] ( http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4006.html )
130147- [ N4240 Improved insertion interface for unique-key maps (Revision 2)] ( http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4240.html )
131148- [ N4279 Improved insertion interface for unique-key maps (Revision 2.3)] ( http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4279.html )
149+ - [ P2363R5: Extending associative containers with the remaining heterogeneous overloads] ( https://open-std.org/jtc1/sc22/wg21/docs/papers/2023/p2363r5.html )
150+ - C++26で` template <class K> ` のバージョンが追加された
0 commit comments