首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C++ 右值引用與 std::move:語義轉移而非實際移動,移後狀態有效但未指定

     編輯:程式設計綜合問答

代碼分析

int &&r1 = 42;
int &&r2 = r1;          // 錯誤:r1 是左值 (有名稱的右值引用)
int &&r3 = std::move(r1); // 正確:強制轉為右值

cout << r1 << endl; // 合法,但值為「有效但未指定」

核心觀念

  1. `std::move` 不移動任何資料,僅是 static_cast(obj),**編譯器層面的類型轉換**,將左值轉為右值引用,啟用移動建構/賦值。
  2. 移後狀態 (Moved-from state):標準規定物件仍處於「有效但未指定狀態」。
    對於 `int` 等基本型別,**無影響**,仍可正常讀寫。
    對於類別型別 (如 `std::vector`),內部指標可能已轉移,僅保證可安全析構、賦值新值,**不可依賴原值**。
  3. 語義承諾:呼叫 `std::move` 代表「我不再需要原值,請盡情掠奪資源」。違反此承諾 (如繼續使用原值) 屬邏輯錯誤,雖編譯通過。

最佳實踐

  • **僅在需要移動語義處** 使用 `std::move` (回傳區域物件、放入容器、轉發參數)。
  • **勿對 `const` 物件 `move`** (無法觸發移動建構,退化為複製)。
  • **移後物件僅允許**:析構、賦值新值、重置狀態 (如 `clear()`)。
  • 基本型別 (`int`, 指標) 無移動語義,`move` 純屬多餘。

參考原始碼

std::move 實現極簡:libc++ move 實現。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved