https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92300
--- Comment #4 from Jonathan Wakely <redi at gcc dot gnu.org> --- (In reply to Jonathan Wakely from comment #3) > This inserts the correct value type, and doesn't perform an addition > allocation: > > assert(a.insert(std::pair<const int, int>(1, 1)).second); > assert(a.insert(std::pair<const int, int>(2, 2)).second); > assert(!a.insert(std::pair<const int, int>(1, 3)).second); Or simply a.insert({1, 1}) which calls the same overload as those lines above. Basically the problem is that you are using make_pair when it isn't only unnecessary, it's actively harmful. There are much better solutions in modern C++. However, there are other scenarios where this optimization would be useful, where you already have a pair from some other source (rather than creating it incorrectly at the point of insertion).