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, there should be no difference here with respect to 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, page.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 in not having = in there?
The rule of auto type deduction changed since C++17.
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. forx11
andx22
) 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.