4000. flat_map::insert_range's Effects is not quite right

Section: 23.6.8.7 [flat.map.modifiers] Status: New Submitter: Hewill Kang Opened: 2023-10-23 Last modified: 2024-02-22

Priority: 3

View all issues with New status.

Discussion:

flat_map::insert_range adds elements to the containers member via:

for (const auto& e : rg) {
  c.keys.insert(c.keys.end(), e.first);
  c.values.insert(c.values.end(), e.second);
}

which is incorrect because rg's value type may not be a pair (tuple, for instance), which means that .first and .second are not valid in such cases.

[2024-02-22; Reflector poll]

Set priority to 3 after reflector poll in October 2023.

"This is P2767 section 6 which LWG looked at in Varna, and was turned into https://github.com/cplusplus/draft/pull/6274 as an editorial change."

Proposed resolution:

This wording is relative to N4964.

  1. Modify 23.6.8.7 [flat.map.modifiers] as indicated:

    template<container-compatible-range<value_type> R>
      void insert_range(R&& rg);
    

    -12- Effects: Adds elements to c as if by:

    for (value_typeconst auto& e : rg) {
      c.keys.insert(c.keys.end(), std::move(e.first));
      c.values.insert(c.values.end(), std::move(e.second));
    }
    

    […]