为什么编译器无法通过引用传递2D数组来计算数组的大小

Kas*_*eda 3 c++ template-argument-deduction

只是想知道 - 我写了以下功能

template <class T, size_t N>
T* asFlatArray (T arr[][N])
{
    // some code
}
Run Code Online (Sandbox Code Playgroud)

并称之为

asFlatArray(myArray); // where myArray is int myArray[some_size][sime_size];
Run Code Online (Sandbox Code Playgroud)

编译运行没有错误.但如果我改变'arr'来引用像

template <class T, size_t N>
T* asFlatArray (T (&arr)[][N])
{
    // some code
}
Run Code Online (Sandbox Code Playgroud)

我会有错误:

parameter ‘arr’ includes reference to array of unknown bound ‘T [][N]’
Run Code Online (Sandbox Code Playgroud)

我知道如何解决它

template <class T, size_t Rows, size_t Columns>
T* asFlatArray (T (&arr)[Rows][Columns])
Run Code Online (Sandbox Code Playgroud)

但我不明白为什么会这样?

jua*_*nza 5

根本问题是第一个功能模板相当于

template <class T, size_t N>
T* asFlatArray (T (*arr)[N]) {}
Run Code Online (Sandbox Code Playgroud)

所以没有要计算的维度.它将匹配指向数组的指针,或任何可以衰减到指向数组的指针.因此也可以匹配2D阵列.

对于第二个示例,类型的引用或指针T[][N]不能是函数参数,这会导致编译器错误.当然,您可以为缺少的维度添加额外的模板参数:

template <class T, size_t N, size_t M>
T* asFlatArray(T (&arr)[N][M]) {}
Run Code Online (Sandbox Code Playgroud)