初始化清單行為:std::vector 和std::array 的差異
雖然std::vector 和std::array 是C 中的兩個容器,它們與初始值設定項清單的行為不同。在本文中,我們將探討聚合初始化的複雜性,並了解為什麼 std::array 需要雙大括號。
考慮以下初始化std::vector 和std:: 的程式碼片段: array:
std::vector<int> x{1,2,3,4}; std::array<int, 4> y{{1,2,3,4}};
std::vector 初始化
std::vector 初始化
std ::vector 支援使用者定義的建構函數,包括那些接受std::initializer_list 的建構子。因此,我們可以直接使用大括號來初始化 x,而不需要額外的大括號。
std::array 初始化
與 std::vector 不同,std::array是一個沒有使用者定義的建構函式的聚合。相反,它依賴聚合初始化,這是從 C 繼承的功能。std::array<int, 4> y = { { 1, 2, 3, 4 } };
在「舊式」聚合初始化中,使用等號和冒號:
但是,當使用直接時列表初始化(在C 11 中引入),此= 語法不再有效。此外,大括號省略(允許省略額外的大括號)僅在使用舊樣式 = 語法的聲明中允許。對於直接清單初始化,額外的大括號是必要的。
CWG 缺陷
std::array<int, 4> y{ 1, 2, 3, 4 };
CWG 缺陷報告(CWG 缺陷 #1270)旨在透過允許省略大括號來解決此限制其他形式的清單初始化。如果採用,以下程式碼將是格式良好的:
總而言之,帶有初始化器列表的std::vector 和std::array 之間的行為差異源自於它們作為帶有初始化器清單的類別的基本特徵分別是使用者定義的建構子和依賴聚合初始化的聚合。 std::array 需要使用雙大括號來符合聚合初始化的規則,而 std::vector 允許使用一組大括號直接初始化,而不依賴舊式聚合初始化語法。以上是為什麼 `std::array` 在初始化清單中需要雙花括號?的詳細內容。更多資訊請關注PHP中文網其他相關文章!