-

   rss_rss_hh_new

 - e-mail

 

 -

 LiveInternet.ru:
: 17.03.2011
:
:
: 51

:


[ ] C++: , ,

, 07 2017 . 10:58 +

, (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};
}

? ? .


Disclaimers


  1. , . , C++.
  2. , . {...} braced-init-lists, std::initializer_list, , - : int x{5} list-init, uniform initialization syntax, .

Attention!


. , , .


, braced-init-lists ( , {1, 2, 3}, uniform initialization syntax) std::initializer_list ! , , .


.


Unicorn initialization syntax



C++98 ( bugfix-update, C++03) , . :


  • C ( , ) , C++ (, C++-)
  • - (, std::vector) , (Boost.Assign) ,
  • (narrowing conversion) , double int
  • Most vexing parse, C++-.

C++11 : :


  • , C, ,
  • , ,

Pitfalls


, : , 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 :


  1. std::initializer_list ( , std::initializer_list ). .
  2. , braced-init-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 ( , - , ). , , .


Almost Always Auto


braced-init-list- ? , auto x = {0}; auto y = {1, 2};? :


  1. ( , ?)
  2. int,
  3. , x, y 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, , , , , , (!) .


, , , :


  1. , , ( )
  2. std::initializer_list,
  3. , , ( , range-)
  4. - , ,
  5. braced-init-list auto
  6. , ( , , )
  7. , , , braced-init-list 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% . , - , .

Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/330402/

:  

: [1] []
 

:
: 

: ( )

:

  URL