《C++ Primer》第五版 302 頁提到 `std::array` 不支援 `c = {a, b, c...}` 形式賦值,但 MSVC 2015 和 g++ 均能編譯通過,是否為標準行為?
這是 C++11/14 標準明確支援的聚合初始化/列表初始化語法。
std::initializer_list 與列表初始化 `{}`,`std::array` 作為聚合型別(無使用者宣告建構函式、無私有/受保護非靜態資料成員、無基類、無虛函式),天然支援聚合初始化。#include <array>
#include <iostream>
int main() {
std::array a = {1, 2, 3}; // 直接列表初始化 (C++11)
std::array b;
b = {4, 5, 6}; // 列表指派 (C++11)
std::array c = {7, 8}; // 部分初始化,剩餘值為 0
for (auto v : c) std::cout << v << ' '; // 輸出 7 8 0
}
| 編譯器 | 最低版本 | 標準旗標 |
|---|---|---|
| GCC | 4.8 | -std=c++11 |
| Clang | 3.3 | -std=c++11 |
| MSVC | 2013 (部分), 2015 完整 | /std:c++14 |
書本描述可能基於 C++03 視角或舊版標準草案。現代 C++ (C++11 起) 完全支援 `std::array` 的列表初始化與指派,放心使用即可。