簡體   English   中英

為什么std :: vector和std :: array的C ++ initializer_list行為不同?

[英]Why is the C++ initializer_list behavior for std::vector and std::array different?

碼:

std::vector<int> x{1,2,3,4};
std::array<int, 4> y{{1,2,3,4}};

為什么我需要std :: array的雙花括號?

std::array<T, N>是一個聚合:它沒有任何用戶聲明的構造函數,甚至沒有一個使用std::initializer_list 使用大括號初始化使用聚合初始化 ,這是從C繼承的C ++的一個特性。

聚合初始化的“舊樣式”使用=

std::array<int, 4> y = { { 1, 2, 3, 4 } };

使用這種舊式的聚合初始化,可以省略額外的大括號,因此這相當於:

std::array<int, 4> y = { 1, 2, 3, 4 };

但是,這些額外的括號只能在“形式T x = { a }; ”(C ++11§8.5.1/ 11)的聲明中被省略,也就是說,當使用舊樣式= 允許括號省略的此規則不適用於直接列表初始化。 這里的腳注如下:“在列表初始化的其他用途中不能省略大括號。”

有關此限制的缺陷報告: CWG缺陷#1270 如果采用提議的解決方案,將允許使用大括號來進行其他形式的列表初始化,並且以下內容將是格式良好的:

std::array<int, 4> y{ 1, 2, 3, 4 };

(帽子向Ville Voutilainen提示找到缺陷報告。)

因為std::vector提供了一個構造函數,它接受了一個std::initializer_list<T> ,而std::array沒有構造函數,而{1, 2, 3, 4}支撐的init-list實際上並沒有被解釋為std::initializer_list ,但是std::array的內部C風格數組的聚合初始化(第二組括號來自的地方:一個用於std::array ,一個用於內部C風格的成員數組)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM