Code:
std::vector<int> x{1,2,3,4};
std::array<int, 4> y{{1,2,3,4}};
Why do I need double curly braces for std::array?
Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.
Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.
Lost your password? Please enter your email address. You will receive a link and will create a new password via email.
Please briefly explain why you feel this question should be reported.
Please briefly explain why you feel this answer should be reported.
Please briefly explain why you feel this user should be reported.
std::array<T, N>is an aggregate: it doesn’t have any user-declared constructors, not even one taking astd::initializer_list. Initialization using braces is performed using aggregate initialization, a feature of C++ that was inherited from C.The “old style” of aggregate initialization uses the
=:With this old style of aggregate initialization, extra braces may be elided, so this is equivalent to:
However, these extra braces may only be elided “in a declaration of the form
T x = { a };” (C++11 §8.5.1/11), that is, when the old style=is used . This rule allowing brace elision does not apply for direct list initialization. A footnote here reads: “Braces cannot be elided in other uses of list-initialization.”There is a defect report concerning this restriction: CWG defect #1270. If the proposed resolution is adopted, brace elision will be allowed for other forms of list initialization, and the following will be well-formed:
(Hat tip to Ville Voutilainen for finding the defect report.)