https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91541
--- Comment #10 from Jonathan Wakely <redi at gcc dot gnu.org> --- I don't think it's possible to construct an example where this would misbehave. If allocator_traits<X>::is_always_equal is true for X then it implies that operator== will return true for all values of X, **and also** for any values of Y that are constructed from values of X. Even if allocator_traits<Y>::is_always_equal is actually false (because some values of Y can compare non-equal), **for the specific values we care about** (i.e. ones constructed by copying an X), operator== will always return true. That means we don't need to reallocate, and so no exceptions are possible. What really matters is whether we need to reallocate, **not** whether allocator_traits<Y>::is_always_equal is true or not. As long as we don't reallocate, we won't get exceptions, and so we won't try to throw from a noexcept function. So you're worrying about nothing and wasting your time and mine.