首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 入門

C++11 右值引用與移動語義深度解析

     編輯:C++ 入門

左值與右值

  • 左值:有持久內存地址,可取地址,可賦值。如變量 int a、解引用 *p、函數返回引用。
  • 右值:臨時對象,無持久地址,不可取地址。如字面量 10、函數返回值 getName()、std::move(x) 結果。

右值引用 T&&

僅能綁定右值,延長臨時對象生命周期。配合 std::move 將左值轉為右值引用,啟用移動語義。

class ArrayWrapper {
    int* data; size_t size;
public:
    ArrayWrapper(size_t n) : data(new int[n]), size(n) {}
    // 移動構造
    ArrayWrapper(ArrayWrapper&& other) noexcept
        : data(other.data), size(other.size) {
        other.data = nullptr; other.size = 0; // 關鍵:置空源對象
    }
    // 移動賦值
    ArrayWrapper& operator=(ArrayWrapper&& other) noexcept {
        if (this != &other) {
            delete[] data;
            data = other.data; size = other.size;
            other.data = nullptr; other.size = 0;
        }
        return *this;
    }
    ~ArrayWrapper() { delete[] data; }
};

std::move 實現原理

本質是 static_cast,利用引用折疊規則:

template
typename remove_reference::type&& move(T&& t) noexcept {
    return static_cast::type&&>(t);
}
  • 傳入左值 T 推導為 T& → T& && 折疊為 T& → 返回 T&&。
  • 傳入右值 T 推導為 T → T&& → 返回 T&&。

成員對象的移動

移動構造中,成員若為類類型,**需顯式 std::move** 才會調用其移動構造,否則調用拷貝構造。

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