首頁 >後端開發 >C++ >為什麼 std::array 需要雙花括號來初始化列表,而 std::vector 不需要?

為什麼 std::array 需要雙花括號來初始化列表,而 std::vector 不需要?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-11-07 03:40:03818瀏覽

Why does std::array require double curly braces for initializer lists while std::vector doesn't?

std::vector 和std::array 的C Initializer_List 行為差異

當對C 容器使用初始值設定項目清單時,std::vector 和std::vector 之間會出現令人困惑的差異std::陣列。讓我們探討一下這種行為背後的原因。

問題:

考慮以下程式碼:

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

為什麼需要使用雙捲曲

答案:

該行為源自於std::array 的本質。作為一個總體。聚合沒有使用者宣告的建構函數,包括接受初始值設定項清單的建構函數。因此,std::array 的聚合初始化是透過使用= 語法的「舊式」初始化來執行的:

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

在這種舊式中,可以省略額外的大括號,從而產生等效的程式碼:

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

但是,只有在使用= 語法的舊式初始化時才允許省略大括號。直接列表初始化不使用 = 語法,不允許省略大括號。此限制受 C 11 §8.5.1/11 管轄。

提議的解決方案:

已提出缺陷報告(CWG 缺陷 #1270)來解決此問題限制。如果建議的解決方案被採納,所有形式的列表初始化都將允許大括號省略,包括以下內容:

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

此更改將為std::vector 和std::array 的行為帶來一致性使用初始值設定項目清單時。

以上是為什麼 std::array 需要雙花括號來初始化列表,而 std::vector 不需要?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn