程式碼使用 C++11 參考限定符(ref-qualifiers):
class Widget {
void doWork() &; // 僅限左值物件呼叫
void doWork() &&; // 僅限右值物件呼叫
};
Visual Studio (舊版本) 編譯報錯,刪除 `&` / `&&` 後正常。
參考限定符是 C++11 新增特性。Visual Studio 完整支援的時間線:
// 檢查 _MSVC_LANG 或 __cplusplus
#if __cplusplus >= 201103L
// 支援 C++11
#endif
在 VS「專案屬性 → C/C++ → 語言 → C++ 語言標準」選擇 **ISO C++14/17/20** 或 `/std:c++14` 以上。
| 宣告 | 可呼叫物件 | 典型用途 |
|---|---|---|
void foo() &; | 左值 (`obj.foo()`) | 避免對臨時物件修改狀態 |
void foo() &&; | 右值 (`std::move(obj).foo()` / `Widget().foo()`) | 移動語意優化、資源竊取 |
void foo() & = delete; | 禁用左值呼叫 | 強制只能用右值呼叫 |
void doWork(); // 左值
void doWork() && = delete; // 無法直接表達,改用文檔規範或靜態分析VS 舊版本不支援 C++11 參考限定符。升級工具鏈或移除該特性。現代 C++ 開發請務必使用支援 C++17 以上的編譯器版本。