Trước C++11, truyền object lớn (vector, string) vào hàm luôn copy → tốn kém. Move semantics cho phép "chuyển nhượng" tài nguyên thay vì copy.
- lvalue: object có địa chỉ xác định (có thể lấy
&). - rvalue: giá trị tạm thời, không có địa chỉ bền vững (kết quả biểu thức, literal).
T&&(rvalue reference): bind vào temporary, cho phép "cướp" tài nguyên.
cpp
std::vector<int> a = {1, 2, 3};
std::vector<int> b = std::move(a); // a rỗng sau move, b có data
// std::move: cast sang rvalue reference — không move gì cả, chỉ castKết quả: push_back với rvalue không copy nữa — cải thiện hiệu năng đáng kể với object lớn.
Return value từ hàm (RVO/NRVO) cũng được tối ưu tương tự.