[ ] C++: , , |
, (braced initializer lists) C++, , , , .
( language lawyer-) , , , :
:
std::vector v1{5};
std::vector v2(5);
std::vector v3({5});
std::vector v4{5};
std::vector v5 = 5;
C++ , :
std::vector x( {"a", "b"} );
std::vector y{ {"a", "b"} };
!
// , ?
std::vector> v1{{{{{}}}}};
, , ?
struct T{};
struct S {
S(std::initializer_list);
S(double, double);
S(T, T);
};
int main() {
S{T{}, T{}}; // ?
S{1., 2.}; // ?
}
Almost Always Auto, . , :
auto x = {0}; // x?
auto y{0}; // y?
// ?
:
struct S {
std::vector a, b;
};
struct T {
std::array a, b;
};
int main() {
T t1{{1, 2}, {3, 4}};
T t2{1, 2, 3, 4};
T t3{1, 2};
S s1{{1, 2}, {3, 4}};
S s2{1, 2, 3, 4};
S s3{1, 2};
}
? ? .
{...}
braced-init-lists, std::initializer_list
, , - : int x{5}
list-init, uniform initialization syntax, .. , , .
, braced-init-lists ( , {1, 2, 3}, uniform initialization syntax) std::initializer_list
! , , .
.
C++98 ( bugfix-update, C++03) , . :
std::vector
) , (Boost.Assign
) , double
int
C++11 : :
, : , C++11 , variadic- , , :
std::vector
- std::initializer_list
" ", , braced-init-list-.
""? , .
? , : " braced-init-list- - ", .
(, , std::initializer_list
braced-init-list )
- ? vector(std::initializer_list
? .
:
std::vector v{5};
, v(5)
v({5})
? , 5 , 5
?
(overload resolution, ) list-initialization :
std::initializer_list
( , std::initializer_list
). ., , , . . , std::vector
:
template struct vec {
vec(std::initializer_list);
};
int main() {
vec v1{{{}}};
}
1 {{{}}}
std::initializer_list
, int
{{}}
. {}
zero-initialization, .
, , , , . , .
struct S {
S(std::initializer_list);
S(double, double);
};
int main() {
S{1., 2.};
}
. , std::string
, . , , , , , .
- ? . , C, , :
struct A { int i, j; };
struct B { A a1, a2; };
int main() {
B b1 = {{1, 2}, {3, 4}};
B b2 = {1, 2, 3, 4}; // brace elision
B b3 = {{1, 2}}; // clause omission
}
, ( , C- , POD, POD ) , . C++.
, , ? , GCC clang, , std::array
-, . , :
int main() {
std::array a = {1,2,3};
}
GCC "" -Wall
, clang- -.
, , std::array
— , : , . C .
, - — ( ) . , (, vector::emplace_back
make_unique
), , "". , list-initialization "" std::initializer_list
( , - , ). , , .
braced-init-list- ? , auto x = {0}; auto y = {1, 2};
? :
int
, std::initializer_lits
( std::initializer_list
), ++11 . , ( ), http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3922.html, 2 copy-list-initialization (auto x = {5}
), direct-list-initialization (auto x{5}
) -.
. -, , . , , .
std::initializer_list
— , , , - , , , . , , :
, , [over.best.ics]/4.5, , , , , , (!) .
, , , :
std::initializer_list
, auto
std::initializer_list
, , , , .
, std::initializer_list
. , ( , , - <$...$>
std::of(...)
). - : std::vector> x = std::of(std::of(1, 2), std::of(3, 4));
? ( most vexing parse ) std::initializer_list
, , vector
vector
, .
, : C ( , ).
-. std::array
, . , , , , , :
struct S {
int a, b;
S(...) = aggregate;
};
, 100% . , - , .