std::array 的推导指南

Vla*_*cow 8 c++ stdarray c++17 c++20 deduction-guide

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

template<class T, class... U>
array(T, U...) -> array<T, 1 + sizeof...(U)>;
Run Code Online (Sandbox Code Playgroud)

例如这个声明的结果

std::array a = { 1ll, 2llu };
Run Code Online (Sandbox Code Playgroud)

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

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

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

Cal*_*eth 12

C++17 在推导指南中有这样的要求。

\n
\n
template<class T, class... U>\narray(T, U...) -> array<T, 1 + sizeof...(U)>;\n
Run Code Online (Sandbox Code Playgroud)\n

要求(is_\xc2\xadsame_\xc2\xadv<T, U> && ...)为真。否则程序格式不正确。

\n
\n

[array.cons#2]

\n