Home  >  Article  >  Backend Development  >  Why Does `std::array` Require Double Curly Braces for Initialization, While `std::vector` Only Needs Single Curly Braces?

Why Does `std::array` Require Double Curly Braces for Initialization, While `std::vector` Only Needs Single Curly Braces?

Barbara Streisand
Barbara StreisandOriginal
2024-11-07 07:30:03443browse

Why Does `std::array` Require Double Curly Braces for Initialization, While `std::vector` Only Needs Single Curly Braces?

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!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn