https://gcc.gnu.org/bugzilla/show_bug.cgi?id=117921
Bug ID: 117921
Summary: containers do not use ADL swap for Compare, Pred or
Hash types
Product: gcc
Version: 15.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: libstdc++
Assignee: unassigned at gcc dot gnu.org
Reporter: redi at gcc dot gnu.org
Target Milestone: ---
"Any Compare, Pred, or Hash types belonging to a and b shall meet the
Cpp17Swappable requirements and shall be exchanged by calling swap as described
in 16.4.4.3. [...] the allocators of a and b shall also be exchanged by calling
swap
as described in 16.4.4.3."
But our hash containers get this wrong:
void
_M_swap(_Hash_code_base& __x)
{ std::swap(__ebo_hash::_M_get(), __x.__ebo_hash::_M_get()); }
void
_M_swap(_Hashtable_base& __x)
{
__hash_code_base::_M_swap(__x);
std::swap(_EqualEBO::_M_get(), __x._EqualEBO::_M_get());
}
The RB tree gets it wrong too:
std::swap(this->_M_impl._M_key_compare, __t._M_impl._M_key_compare);
They're correct for the allocators, as they use std::__alloc_on_swap.