I think the one thing that you misunderstood is that it is up to programmer to decide what is Moveable and what is not. Unfortunately, this too complex for any compiler check, so programmers is required to mark Moveable types (by deriving from Moveable<T>).