initializer_list with auto contains multiple expressions

  • A+
Category:Languages

Rather simple question,

auto x11 {1,2,3,4}; auto x1 = {1,2,3,4}; auto x22 {1.0, 2.25, 3.5}; auto x2 = {1.0, 2.25, 3.5}; 

As far as I understand, the should be no difference in here w.r.t. having = or not. However, using llvm/clang 6.0.0 (with --std=c++17), I get :

main1.cpp:35:17: error: initializer for variable 'x11' with type 'auto' contains multiple   expressions auto x11 {1,2,3,4}; ~~~~~~~~    ^  main1.cpp:37:20: error: initializer for variable 'x22' with type 'auto' contains multiple   expressions auto x22 {1.0, 2.25, 3.5}; 

From Stroustroup's c++ book, I see p.162

auto x1 {1,2,3,4}; // x1 is an initializer_list<int> auto x2 {1.0, 2.25, 3.5 }; // x2 is an initializer_list of<double> 

So, is there really a problem not having = in there?

 


The rule of auto type deduction changed since C++17.

(since C++17)
In direct-list-initialization (but not in copy-list-initalization), when deducing the meaning of the auto from a braced-init-list, the braced-init-list must contain only one element, and the type of auto will be the type of that element:

auto x1 = {3}; // x1 is std::initializer_list<int> auto x2{1, 2}; // error: not a single element auto x3{3};    // x3 is int                // (before C++17 x2 and x3 were both std::initializer_list<int>) 

So before C++17, all the variables in your sample work fine and have type std::initializer_list<int>. But since C++17, for direct initialization (i.e. for x11 and x22) the braced-initializer must contain only one element (and their type would be the type of the element) then become ill-formed code.

See N3922 and N3681 for more.

Comment

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: