https://gcc.gnu.org/bugzilla/show_bug.cgi?id=118079
Bug ID: 118079
Summary: std::deque has too many overloads called _M_insert_aux
Product: gcc
Version: 15.0
Status: UNCONFIRMED
Keywords: rejects-valid
Severity: normal
Priority: P3
Component: libstdc++
Assignee: unassigned at gcc dot gnu.org
Reporter: redi at gcc dot gnu.org
Target Milestone: ---
#include <deque>
struct X
{
template<typename T>
X(T, T, std::size_t)
{ }
};
int main() {
std::deque<X> d;
d.emplace(d.begin(), d.begin(), d.begin(), std::size_t(0));
}
This should just insert an X but emplace calls:
return _M_insert_aux(__position._M_const_cast(),
std::forward<_Args>(__args)...);
This is supposed to call this overload:
template<typename... _Args>
iterator
_M_insert_aux(iterator __pos, _Args&&... __args);
but it's a perfect match for:
// called by range_insert_aux for forward iterators
template<typename _ForwardIterator>
void
_M_insert_aux(iterator __pos,
_ForwardIterator __first, _ForwardIterator __last,
size_type __n);
which is a completely different function with different semantics (and a void
return type).
There's no reason all these different _M_insert_aux helpers should have the
same name.