C++ 函数模板需要 & 用于数组参数

Top*_*ort 2 c++ templates c++20

在此 MCVE 中,编译器抱怨processArray无法匹配参数列表 ( arr)。修复方法是替换T elements[SIZE]T (&elements)[SIZE]. 为什么我需要这样做,在什么情况下?我&通常不会将数组传递给函数。(我想到它的唯一原因是 C++20 的新版本是如何istream& operator>>描述它的 char-array 参数的。)

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;
}
Run Code Online (Sandbox Code Playgroud)

Nat*_*ica 5

这是因为数组衰减。除非您通过引用传递数组,否则它将衰减为指针。这意味着

void processArray(T elements[SIZE])
Run Code Online (Sandbox Code Playgroud)

是真的

void processArray(T* elements)
Run Code Online (Sandbox Code Playgroud)

并且无法获取SIZE模板的内容,因为指针不知道它指向的数组的大小。

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