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

C++11 左值引用與右值引用完整指南:語法、語義與移動構造

     編輯:關於C++

引用聲明語法

類型語法標準
左值引用Type& attr(optional) declaratorC++98
右值引用Type&& attr(optional) declaratorC++11

左值引用 (Type&)

左值引用是物件別名,必須初始化且不可重繫結。本質上為指標,編譯器自動處理取址與解引用。

核心用法

  1. 別名綁定:
    std::string s = "Ex";
    std::string& r1 = s;
    const std::string& r2 = s;
    r1 += "ample"; // 修改 s
    // r2 += "!";  // 錯誤:const 引用不可修改
    
  2. 函數參數傳遞:避免拷貝,允許修改實參。
    void double_string(std::string& s) { s += s; }
    std::string str = "Test";
    double_string(str); // str 變為 "TestTest"
    
  3. 函數回傳左值引用:呼叫式本身成為左值,可作為賦值目標。
    char& char_number(std::string& s, size_t n) { return s.at(n); }
    char_number(str, 1) = 'a'; // 修改 str[1]
    

右值引用 (Type&&)

右值引用區分左值與右值,支援移動語義,可將臨時物件資源「移動」而非複製,延長臨時物件生命週期。

核心特性

  1. 綁定規則:右值引用只能綁定右值(臨時物件、字面值、std::move(x) 結果)。const Type& 也可綁定右值(延長生命週期),但不可修改。
    std::string s1 = "Test";
    std::string&& r1 = s1;           // 錯誤:s1 為左值
    const std::string& r2 = s1 + s1; // 正常:const 左值引用延長臨時物件生命週期
    std::string&& r3 = s1 + s1;      // 正常:右值引用延長臨時物件生命週期
    r3 += "Test";                    // 正常:可修改非 const 右值引用
    
  2. 多載解析:函數同時提供左值/右值引用多載時,編譯器根據實參值類別選擇:
    void f(int& x) { cout << "lvalue ref\n"; }
    void f(const int& x) { cout << "const lvalue ref\n"; }
    void f(int&& x) { cout << "rvalue ref\n"; }
    
    int i = 1; const int ci = 2;
    f(i);        // lvalue ref
    f(ci);       // const lvalue ref
    f(3);        // rvalue ref
    f(std::move(i)); // rvalue ref
    
    此機制支援移動建構子 T(T&&) 與移動指派 T& operator=(T&&),實現資源高效轉移。
  3. 生命週期延長:右值引用綁定臨時物件時,臨時物件生命週期延長至引用變數作用域結束(同 const Type&)。

實戰意義:移動語義與完美轉發

右值引用是 C++11 移動語義的基石:

  • 移動建構子:Class(Class&& other) noexcept : ptr(other.ptr) { other.ptr = nullptr; } 掠奪資源,避免深度複製。
  • 完美轉發:template<class T> void wrapper(T&& arg) { func(std::forward<T>(arg)); } 保持實參值類別(左值/右值)傳遞給目標函數。
  • std::move(x):將左值強制轉換為右值引用(static_cast<T&&>(x)),聲明「可被移動」。

總結對比

特性左值引用 T&右值引用 T&&
綁定對象左值右值(臨時物件、std::move 結果)
可修改性可修改(非 const)可修改(非 const)
生命週期延長否(const T& 可)是
核心用途別名、輸出參數、避免拷貝移動語義、完美轉發、資源掠奪
多載優先級左值優先匹配右值優先匹配
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved