The type may move between objects without side effects. Notably, this is
not implemented for invariant pointers or types that contain them, since an invariant pointer
may reference an object’s Foreign Object Table. This is a little restrictive (technically
intra-object pointers are safe to move intra-object), but it’s the best we can do at
compile-time.