C++ 非size_t整数的 std::数组的模板参数推导

C++ template parameter deduction for std::array with non size_t integer

本文关键字:数组 参数 std size 整数 C++      更新时间:2023-10-16

我正在尝试使避免可变参数模板函数中的结构中提出的解决方案适应我的需要。但是,我无法理解G ++的行为。请考虑以下函数:

 template <typename T, unsigned Size>
 int nextline(const typename std::array<T, Size> ar) {
    return 0;
 }

然后打电话

 nextline(std::array<int, 2> { 1,0 });

与 GCC 抱怨不匹配

eslong.cpp: In function ‘int main()’:
eslong.cpp:10:38: error: no matching function for call to ‘nextline(std::array<int, 2ul>)’
   nextline(std::array<int, 2> { 1,0 });
                                      ^
eslong.cpp:10:38: note: candidate is:
eslong.cpp:4:5: note: template<class T, unsigned int Size> int nextline(std::array<T, Size>)
 int nextline(const typename std::array<T, Size> ar) {
     ^
eslong.cpp:4:5: note:   template argument deduction/substitution failed:
eslong.cpp:10:38: note:   mismatched types ‘unsigned int’ and ‘#‘integer_cst’ not supported by dump_type#<type error>’
   nextline(std::array<int, 2> { 1,0 });
                                      ^
eslong.cpp:10:38: note:   ‘std::array<int, 2ul>’ is not derived from ‘std::array<T, Size>’

但是,如果我将unsigned Size更改为unsigned long Sizesize_t,它会匹配。我不确定这里发生了什么。调用std::array<T, Size>中的Size参数不是转换为size_t吗?

std::array模板化为:

template<class T, std::size_t N > struct array;

N的大小要求是size_t类型。但是在你的函数中,你传递了一个无符号的(int),它不能被解释为size_t。根据SFINAE 如果无法推断出模板,则它不存在,因此您的模板化函数不存在。

这不是调用线路的问题,而是函数模板的声明。要更正此问题,请使用正确的类型:

template <typename T, size_t Size>
int nextline(const typename std::array<T, Size> ar) {
  return 0;
 }

在这种情况下,即使您使用:

nextline(std::array<int, 2ul> { 1,0 });

它仍然有效,因为它可以被推导和铸造。

<小时 />

dyp的附加说明:

[temp.deduct.type]/17 用于非类型模板参数,要求推导事物的类型(模板参数)与推导它的模板参数的类型相同。

您的文字2被解释为unsigned long,但您声明Size模板为unsigned int。只需改用这个:

template <typename T, size_t Size>