代碼片段:
array<int, 4> a;
a = { 1, 2, 3, 4 }; // 某些編譯器報錯,某些通過
《C++ Primer》第 5 版第 302 頁提到 array 不支持這種賦值,但實測發現現代編譯器(GCC 5+, Clang 3.4+, MSVC 2015+)均能編譯通過。
std::array 是聚合類型,不提供 接受 std::initializer_list 的賦值運算符。因此嚴格來說,a = {1,2,3,4} 在 C++11 下是不合法的。operator=(initializer_list<T>),使上述寫法合法化。書中所述基於 C++11 標準。若你的編譯器默認啟用 C++14 或更高版本(如 GCC 默認 -std=gnu++14),代碼將通過編譯。建議在項目中顯式指定標準版本(-std=c++11 或 -std=c++17),以獲得一致行為。
array<int, 4> a = {1, 2, 3, 4};(C++11 合法)。a = {1, 2, 3, 4}; 替代方案:a = array<int, 4>{1, 2, 3, 4};(構造臨時對象再移動賦值)。