std::array的推导指南

The deduction guide for std::array

在 C++ 标准的 C++ 17 和 C++ 20 工作草案中,class 模板 std::array 的推导指南定义如下

template<class T, class... U>
array(T, U...) -> array<T, 1 + sizeof...(U)>;

例如这个声明的结果

std::array a = { 1ll, 2llu };

应该被编译并且变量a的推导类型是std::array<long long, 2>

然而,编译器使用另一个推导指南来检查所有初始化程序是否具有相同的类型。

这是编译器的错误还是推导指南在 C++ 17 和 C++20 标准中确实发生了变化?

C++17 在演绎指南中有该要求。

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.

[array.cons#2]