代碼分析
int &&r1 = 42;
int &&r2 = r1; // 錯誤:r1 是左值 (有名稱的右值引用)
int &&r3 = std::move(r1); // 正確:強制轉為右值
cout << r1 << endl; // 合法,但值為「有效但未指定」
核心觀念
- `std::move` 不移動任何資料,僅是
static_cast(obj),**編譯器層面的類型轉換**,將左值轉為右值引用,啟用移動建構/賦值。
- 移後狀態 (Moved-from state):標準規定物件仍處於「有效但未指定狀態」。
對於 `int` 等基本型別,**無影響**,仍可正常讀寫。
對於類別型別 (如 `std::vector`),內部指標可能已轉移,僅保證可安全析構、賦值新值,**不可依賴原值**。
- 語義承諾:呼叫 `std::move` 代表「我不再需要原值,請盡情掠奪資源」。違反此承諾 (如繼續使用原值) 屬邏輯錯誤,雖編譯通過。
最佳實踐
- **僅在需要移動語義處** 使用 `std::move` (回傳區域物件、放入容器、轉發參數)。
- **勿對 `const` 物件 `move`** (無法觸發移動建構,退化為複製)。
- **移後物件僅允許**:析構、賦值新值、重置狀態 (如 `clear()`)。
- 基本型別 (`int`, 指標) 無移動語義,`move` 純屬多餘。
參考原始碼
std::move 實現極簡:libc++ move 實現。