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

C++11 參考限定符(& / &&)在 Visual Studio 中報錯?編譯器支援度說明

     編輯:程式設計綜合問答

現象

程式碼使用 C++11 參考限定符(ref-qualifiers):

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

Visual Studio (舊版本) 編譯報錯,刪除 `&` / `&&` 後正常。

原因:編譯器版本不支援

參考限定符是 C++11 新增特性。Visual Studio 完整支援的時間線:

  • VS 2010 / 2012 / 2013:**不支援**(或部分實驗性支援,需特定 CTP)。
  • VS 2015 (MSVC 19.0):**開始支援**,但早期版本有 Bug。
  • VS 2017 15.3+ / VS 2019 / VS 2022:**完善支援**,符合標準。

驗證方法

// 檢查 _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;禁用左值呼叫強制只能用右值呼叫

遷移建議

  1. 升級 VS 至 2017+,並設定 `/std:c++17`。
  2. 若受限於舊編譯器(如 VS2013 維護專案),只能**移除參考限定符**,改用傳統多載:
    void doWork(); // 左值
    void doWork() && = delete; // 無法直接表達,改用文檔規範或靜態分析
  3. GCC 4.8.1+、Clang 3.4+ 早已完整支援,跨平台專案建議在 CI 中強制檢查 `-std=c++11 -pedantic-errors`。

總結

VS 舊版本不支援 C++11 參考限定符。升級工具鏈或移除該特性。現代 C++ 開發請務必使用支援 C++17 以上的編譯器版本。

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