https://gcc.gnu.org/bugzilla/show_bug.cgi?id=121348
--- Comment #1 from Andrew Pinski <pinskia at gcc dot gnu.org> --- https://eel.is/c++draft/vector.capacity Preconditions: T is Cpp17CopyInsertable into vector. https://eel.is/c++draft/container.alloc.reqmts#def:Cpp17CopyInsertable_into_X T is Cpp17CopyInsertable into X means that, in addition to T being Cpp17MoveInsertable into X, the following expression is well-formed: allocator_traits<A>::construct(m, p, v) and its evaluation causes the following postcondition to hold: The value of v is unchanged and is equivalent to *p. Looks like there was a change between C++14 and C++17 here though. Because in C++14 (via issue 2033; https://cplusplus.github.io/LWG/issue2033), It was "Requires: T shall be MoveInsertable into *this and CopyInsertable into *this."