std::move — cast to rvalue. std::forward — perfect forwarding.
std::move:
1std::string s1 = "hello";2std::string s2 = std::move(s1); // s1 is now empty34// After move, s1 is in valid but unspecified state
std::forward:
1template<typename T>2void wrapper(T&& arg) {3 // If arg was lvalue, forward as lvalue4 // If arg was rvalue, forward as rvalue5 func(std::forward<T>(arg));6}
Key differences: