In the C 17 and C 20 Working Drafts of the C Standard the deduction guide for the class template std::array
is defined the following way
template<class T, class... U>
array(T, U...) -> array<T, 1 sizeof...(U)>;
As a result for example this declaration
std::array a = { 1ll, 2llu };
should be compiled and the deduced type of the variable a
is std::array<long long, 2>
.
However compilers use another deduction guide that checks that all initializers have the same type.
Is it a bug of compilers or was the deduction guide indeed changed in C 17 and C 20 Standards?
CodePudding user response:
C 17 has that requirement in the deduction guide.
template<class T, class... U> array(T, U...) -> array<T, 1 sizeof...(U)>;
Requires:
(is_same_v<T, U> && ...)
is true. Otherwise the program is ill-formed.