为什么普通函数没有时,模板函数会接收带有1D参考的2D数组

问题描述

||
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 !!!??
}
我可以预见
fun()
会出错,但是
funT()
会如何工作呢! 标准中是否有关于此类行为的参考?还是C ++语言中的错误?     

解决方法

因为
c
的类型不是
char [2]
,所以它与第一个不匹配 功能。在模板的情况下,“ 5”解析为“ 4”,这意味着 最终的参数类型是
char (&a)[2][2]
。 (你可以想到的 因为ѭ5等于ѭ9到ѭ10,并且 以此扩展参数类型。)     ,ѭ5将解析为
char*
char[2]
,因此模板化函数应该没有任何问题。 编辑:感谢詹姆斯指出这一点。