This page is a snapshot from the LWG issues list, see the Library Active Issues List for more information and the meaning of C++20 status.

### 2977. `unordered_meow::merge()` has incorrect Throws: clause

Section: 24.2.8 [unord.req] Status: C++20 Submitter: Tim Song Opened: 2017-06-14 Last modified: 2021-02-25

Priority: 0

View other active issues in [unord.req].

View all other issues in [unord.req].

View all issues with C++20 status.

Discussion:

As pointed out in this StackOverflow question, `unordered_{map,multimap,set,multiset}::merge()` may need to rehash to maintain its `max_load_factor` invariant, which may require allocation, which may throw.

[2017-07 Toronto Monday issue prioritization]

Priority 0; move to Ready

Proposed resolution:

This wording is relative to N4659.

1. In 24.2.8 [unord.req], edit Table 91 "Unordered associative container requirements" as indicated:

   > Table 91 — Unordered associative container requirements (in addition to container)
   > Expression | Return type | Assertion/note pre-/post-condition | Complexity
   > --- | --- | --- | ---
   > `…`
   > `a.merge(a2)` | `void` | Requires: `a.get_allocator() == a2.get_allocator()`. Attempts to extract each element in `a2` and insert it into `a` using the hash function and key equality predicate of `a`. In containers with unique keys, if there is an element in `a` with key equivalent to the key of an element from `a2`, then that element is not extracted from `a2`. Postconditions: Pointers and references to the transferred elements of `a2` refer to those same elements but as members of `a`. Iterators referring to the transferred elements and all iterators referring to `a` will be invalidated, but iterators to elements remaining in `a2` will remain valid. Throws: Nothing unless the hash function or key equality predicate throws. | Average case 𝒪(N), where N is `a2.size()`. Worst case 𝒪(N`*a.size()+`N).
   > `…`