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

C++ array 賦值:關於「不允許用花括號包圍的值列表」的誤解

     編輯:程式設計疑難解答

現象觀察

代碼片段:

array<int, 4> a;
a = { 1, 2, 3, 4 }; // 某些編譯器報錯,某些通過

《C++ Primer》第 5 版第 302 頁提到 array 不支持這種賦值,但實測發現現代編譯器(GCC 5+, Clang 3.4+, MSVC 2015+)均能編譯通過。

標準演進

  • C++11:std::array 是聚合類型,不提供 接受 std::initializer_list 的賦值運算符。因此嚴格來說,a = {1,2,3,4} 在 C++11 下是不合法的。
  • C++14 / C++17:標準增加了 operator=(initializer_list<T>),使上述寫法合法化。

編譯器差異

書中所述基於 C++11 標準。若你的編譯器默認啟用 C++14 或更高版本(如 GCC 默認 -std=gnu++14),代碼將通過編譯。建議在項目中顯式指定標準版本(-std=c++11 或 -std=c++17),以獲得一致行為。

最佳實踐

  1. 統一初始化:優先使用構造時初始化:array<int, 4> a = {1, 2, 3, 4};(C++11 合法)。
  2. 賦值場景:若必須先聲明再賦值,C++11 下可用 a = {1, 2, 3, 4}; 替代方案:a = array<int, 4>{1, 2, 3, 4};(構造臨時對象再移動賦值)。
  3. 以編譯器為準:最終以目標編譯器的實際報錯信息為準,而非書籍舊版本描述。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved