語法
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 參考限定符