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 是什么,因为指针不知道它指向的数组的大小。

一旦您将数组参数作为引用,您就可以停止这种衰减并可以从传递给函数的数组中获取大小。