C++ 函数模板需要 & 作为数组参数
C++ function template requires & for array parameter
在此 MCVE 中,编译器抱怨 processArray
无法匹配参数列表 (arr
)。修复方法是将 T elements[SIZE]
替换为 T (&elements)[SIZE]
。为什么我需要这样做,在什么情况下?我通常不会使用 &
将数组传递给函数。 (我想到它的唯一原因是 C++20 的新版本 istream& operator>>
描述其字符数组参数的方式。)
template <typename T, int SIZE>
void processArray(T elements[SIZE])
{
for (int i = 0; i < SIZE; ++i)
elements[i] = 2;
}
int main()
{
int arr[3];
processArray(arr);
return 0;
}
这是因为array decay。除非您通过引用传递数组,否则它会退化为指针。也就是说
void processArray(T elements[SIZE])
真的
void processArray(T* elements)
并且无法获得模板的 SIZE
是什么,因为指针不知道它指向的数组的大小。
一旦您将数组参数作为引用,您就可以停止这种衰减并可以从传递给函数的数组中获取大小。
在此 MCVE 中,编译器抱怨 processArray
无法匹配参数列表 (arr
)。修复方法是将 T elements[SIZE]
替换为 T (&elements)[SIZE]
。为什么我需要这样做,在什么情况下?我通常不会使用 &
将数组传递给函数。 (我想到它的唯一原因是 C++20 的新版本 istream& operator>>
描述其字符数组参数的方式。)
template <typename T, int SIZE>
void processArray(T elements[SIZE])
{
for (int i = 0; i < SIZE; ++i)
elements[i] = 2;
}
int main()
{
int arr[3];
processArray(arr);
return 0;
}
这是因为array decay。除非您通过引用传递数组,否则它会退化为指针。也就是说
void processArray(T elements[SIZE])
真的
void processArray(T* elements)
并且无法获得模板的 SIZE
是什么,因为指针不知道它指向的数组的大小。
一旦您将数组参数作为引用,您就可以停止这种衰减并可以从传递给函数的数组中获取大小。