https://gcc.gnu.org/bugzilla/show_bug.cgi?id=95349
--- Comment #54 from Jason Merrill <jason at gcc dot gnu.org> --- (In reply to Jonathan Wakely from comment #53) > Couldn't you avoid the launder by returning static_cast<T*>(memmove(p, p, > sizeof(T))) instead? That pointer _does_ point to the new object, doesn't > it? ... huh, no, memcpy and memmove do not return a pointer to a suitable > created object. Seems like they could/should. Hmm, https://eel.is/c++draft/cstring.syn#3 says they implicitly create objects, but a void* can't be a pointer to a suitable created object. And then I read https://eel.is/c++draft/expr#static.cast-13 as saying that the static_cast above returns a pointer to such an implicitly-created object.