If you take C++ and restrict it to references and the built-in std smart pointers, avoid raw pointers and avoid defining your own copy/move semantics, and replace all "a=b" with "a=move(b)", then it's somewhat close to Rust. Somewhat. In a Rust assignment "a=b", because a crucial difference between Rust and C++ is that the rules of LIFETIMES are checked at COMPILE TIME. Once "move occurs", you can no longer refer to the item that was moved because its lifetime has ended (recall that lifetime refers to how long something is guaranteed to stay in the same location in memory). If `a = b` resulted in a move, then any subsequent reference to b will result in a compiler error. C++ will continue to allow you to refer to the moved object, which could result in dereferencing a null pointer.