初始化列表行為:std::vector 和std::array 的差異
而std::vector 和std::array 是C 中的兩個容器,它們與初始值設定項清單的行為不同。在本文中,我們將探討聚合初始化的複雜性,並了解為什麼 std::array 需要雙大括號。
考慮以下初始化 std::vector 和 std:: 的程式碼片段:陣列:
std::vectorx{1,2,3,4}; std::array y{{1,2,3,4}};
std::vector 初始化
std::vector 支持使用者定義的建構函數,包括接受std::initializer_list 的建構函數。因此,我們可以直接使用大括號來初始化 x,而不需要額外的大括號。
std::array 初始化
與 std::vector 不同,std::array是一個沒有使用者定義的建構子的聚合。相反,它依賴聚合初始化,這是從 C 繼承的功能。
在「舊式」聚合初始化中,使用等號和冒號:
std::arrayy = { { 1, 2, 3, 4 } };
但是,當使用直接列表初始化(在C 11 中引入)時,此= 語法不再有效。此外,大括號省略(允許省略額外的大括號)僅在使用舊樣式 = 語法的聲明中允許。對於直接清單初始化,額外的大括號是強制性的。
CWG Defect
CWG 缺陷報告(CWG 缺陷 #1270)旨在透過允許省略大括號來解決此限制其他形式的清單初始化。若採用,以下程式碼將是格式良好的:
std::arrayy{ 1, 2, 3, 4 };
總而言之,具有初始值設定項目列表的std::vector 和std::array 之間的行為源自於它們分別作為具有使用者定義建構子的類別和依賴聚合初始化的聚合的基本特徵。 std::array 需要雙大括號以符合聚合初始化規則,而 std::vector 允許使用一組大括號直接初始化,而不依賴舊式聚合初始化語法。
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3