https://gcc.gnu.org/bugzilla/show_bug.cgi?id=95349
--- Comment #20 from Richard Smith <richard-gccbugzilla at metafoo dot co.uk> --- (In reply to Andrew Downing from comment #19) > Not that it would make a difference in this particular situation, but is the > intent of P0593R6 to only allow implicitly creating an object in the > relevant storage location where one hasn't already been implicitly or > explicitly created? No, the new objects are allowed to replace existing objects. For example, this implementation would also be correct: std::uint64_t* s3(double* p) { std::memmove(p, p, sizeof(double)); return std::launder(reinterpret_cast<std::uint64_t*>(p)); } ... on the basis that it has defined behavior if the memmove implicitly creates an 'uint64_t' object in the underlying storage after it (notionally) copies the contents elsewhere and before it (notionally) copies the contents back again. (The 'launder' is necessary in order to form a pointer to the implicitly-created uint64_t object, because p doesn't point to that object.)