`std::move` casts an expression to an rvalue reference, allowing a move operation to transfer ownership rather than copy it. A named object requires an explicit `std::move`; moving from a temporary happens implicitly. section 2.3 section 2.2
Transfer a thread
`std::thread t2 = std::move(t1);` transfers the thread associated with `t1` to `t2`, leaving `t1` without an associated thread. By contrast, initializing `t1` from a temporary `std::thread` needs no explicit `std::move`. section 2.3
Moving into a `std::thread` that already manages a thread is not a safe way to discard it: move assignment calls `std::terminate()` in that case. Join or detach the existing thread before replacing its owner. section 2.3
void some_function(); void some_other_function(); std::thread t1(some_function); std::thread t2=std::move(t1); t1=std::thread(some_other_function); std::thread t3; t3=std::move(t2); t1=std::move(t3); #1
Trace ownership among three `std::thread` objects and see why the final assignment terminates the program. section 2.3


