Initializer List Behavior Difference in std::vector and std::array
In C , the initializer_list behavior for std::vector and std::array differs significantly. Consider the following code snippets:
std::vector<int> x{1,2,3,4}; std::array<int, 4> y{{1,2,3,4}};
Why does std::array require double curly braces, while std::vector only requires single curly braces?
Explanation
std::vector has a user-defined constructor that takes a std::initializer_list as an argument. This allows for direct list initialization using single curly braces.
On the other hand, std::array is an aggregate type that does not have any user-defined constructors. Instead, it uses aggregate initialization, a feature inherited from C. Aggregate initialization allows for initialization using double curly braces.
The older syntax for aggregate initialization using braces and the = sign is also valid:
std::array<int, 4> y = { { 1, 2, 3, 4 } };
However, this syntax allows for brace elision in certain cases, which is not permitted for direct list initialization with std::array. A footnote in the C standard (C 11 §8.5.1/11) states that "Braces cannot be elided in other uses of list-initialization."
Defect Report and Proposed Resolution
A defect report (CWG defect #1270) has been filed to address this restriction. If the proposed resolution is adopted, brace elision will be allowed for std::array direct list initialization, making the following valid:
std::array<int, 4> y{ 1, 2, 3, 4 };
The above is the detailed content of Why Does `std::array` Require Double Curly Braces for Initialization, While `std::vector` Only Needs Single Curly Braces?. For more information, please follow other related articles on the PHP Chinese website!