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

C++ 成員函式參考限定符(& / &&)作用詳解:限制物件值類別呼叫

     編輯:程式設計綜合問答

語法

class Widget {
    void doWork() &;   // 僅限左值物件呼叫
    void doWork() &&;  // 僅限右值物件呼叫
};

核心作用

限制成員函式可被哪類物件(左值/右值)呼叫,編譯期強制檢查,違反即報錯。

限定符允許呼叫的物件典型場景
& (lvalue ref qualifier)具名變數、左值引用、解引用指標
Widget w; w.doWork();
Widget& ref = w; ref.doWork();
修改物件狀態、回傳 `*this` 供鏈式呼叫、避免對臨時物件副作用
&& (rvalue ref qualifier)臨時物件、std::move(obj)、右值引用
Widget().doWork();
std::move(w).doWork();
移動語意優化、資源竊取(如 `std::vector` 移動建構)、單次消費型 API

實戰範例:資源竊取

class DataBuffer {
    std::vector data_;
public:
    // 左值呼叫:回傳副本,保護原資料
    std::vector getData() & { return data_; }

    // 右值呼叫:移動資料,零拷貝,物件廢棄
    std::vector getData() && { return std::move(data_); }
};

// 使用
DataBuffer db;
auto copy = db.getData();           // 呼叫 & 版本,拷貝
auto moved = DataBuffer().getData(); // 呼叫 && 版本,移動
auto stolen = std::move(db).getData(); // 呼叫 && 版本,移動

重載規則

  • 同名函式可同時提供 `&` 和 `&&` 版本(如上例)。
  • 若只提供 `&&` 版本,左值呼叫將**編譯錯誤**(而非隱式轉換)。
  • 無限定符版本視為「通用」,左值/右值均可呼叫,但有限定符版本優先匹配。

對比:`const` 限定符 vs 參考限定符

總結

參考限定符讓介面設計者能在**編譯期**表達「此函式只能對左值/右值呼叫」的契約,配合移動語意實現零拷貝優化與資源安全轉移,是現代 C++ 高效 API 設計的關鍵工具。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
const 限定符參考限定符 (& / &&)
限制對象物件的 **常量性**物件的 **值類別** (lvalue/rvalue)
典型用途區分讀/寫 (`get() const` vs `get()`)區分拷貝/移動、單次消費
組合可組合:`void foo() const &;`同上