按值傳遞觸發拷貝構造函數,對於管理動態內存的類(如 vector, string, 自定義資源類),深拷貝涉及內存分配、數據複製,開銷大。C++11 引入移動語義,利用右值引用(T&&)將資源「移動」而非複製。
A(A&& other) noexcept,淺拷貝指針,置空來源指針。A& operator=(A&& other) noexcept,釋放自身資源,接管來源資源,置空來源。vector::push_back 提供兩個重載:push_back(const T&)(拷貝)和 push_back(T&&)(移動)。傳遞臨時對象或 std::move(obj) 觸發移動版本,避免拷貝。
class A {
int* data; size_t len;
public:
A(size_t n) : len(n), data(new int[n]) {}
// 移動構造
A(A&& o) noexcept : data(o.data), len(o.len) { o.data = nullptr; o.len = 0; }
// 移動賦值
A& operator=(A&& o) noexcept {
if (this != &o) { delete[] data; data = o.data; len = o.len; o.data = nullptr; o.len = 0; }
return *this;
}
~A() { delete[] data; }
// 交換利用移動
void swap(A& other) { A tmp = std::move(other); other = std::move(*this); *this = std::move(tmp); }
};
std::move 將左值轉為右值引用,啟用移動語義。