https://gcc.gnu.org/bugzilla/show_bug.cgi?id=120432
Bug ID: 120432 Summary: flat_map operator[] is broken for const lvalue keys Product: gcc Version: 16.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: libstdc++ Assignee: unassigned at gcc dot gnu.org Reporter: arthur.j.odwyer at gmail dot com Target Milestone: --- As reported by Rufei Zhao on the cpplang Slack: https://godbolt.org/z/fa48dvnoq std::flat_map<double, double> m; int main(void) { const double e { 3.14 }; std::flat_map<double, double> m; m[e] = 1.0; // bogus error } The problem is that https://github.com/gcc-mirror/gcc/blob/aa93272/libstdc%2B%2B-v3/include/std/flat_map#L1145 says: mapped_type& operator[](const key_type& __x) { return operator[]<const key_type>(__x); } when it means: mapped_type& operator[](const key_type& __x) { return operator[]<const key_type&>(__x); } I'd strongly recommend that you use a different name than `operator[]<U>` for the helper function anyway, because I'm sure there will be additional problems around that that I'm not seeing off the top of my head. ...Actually, I see another easy one off the top of my head. https://godbolt.org/z/ea4WGcbz3 template<class M, class T> concept C = requires (M& m, T t) { m[t]; }; static_assert(!C<std::map<int, int>, volatile int>); static_assert(!C<std::unordered_map<int, int>, volatile int>); static_assert(!C<std::flat_map<int, int>, volatile int>); // bogus error You need that helper function to stay out of the overload set of operator[] so that it doesn't contribute to overload resolution in cases like this.