当普通函数没有时,为什么模板函数接收带有1D引用的2D数组

iam*_*ind 5 c++ arrays templates pass-by-reference

void fun (char (&a)[2])  // 1D reference
{}

template<typename T, int SIZE>
void funT (T (&a)[SIZE])  // 1D reference
{}

int main ()
{
  char c[2][2];  // 2D array
  fun(c);  // error
  funT(c); // ok !!!??
}
Run Code Online (Sandbox Code Playgroud)

我可以期待这fun()会给出错误,但是如何才能funT()正常工作!这种行为的标准中是否有任何参考,或者它是 C++语言中的错误

Jam*_*nze 11

因为类型c不是char [2],它与第一个函数不匹配.在模板的情况下,T解析为char [2],这意味着最终的参数类型是char (&a)[2][2].(您可以将其视为T等同于typedefto char[2],并基于此扩展参数类型.)