为什么模板函数接收带有 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++ 语言中的这是一个错误吗?
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 !!!??
}
I can expect that fun()
gives error, but how come funT()
works fine!
Is there any reference in the standard for such behavior or Is it a bug in C++ language?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
因为
c
的类型不是char [2]
,所以它与第一个不匹配功能。在模板情况下,
T
解析为char [2]
,这意味着最终参数类型为
char (&a)[2][2]
。 (你可以这样想因为
T
相当于typedef
到char[2]
,并且在此基础上扩展参数类型。)
Because the type of
c
isn'tchar [2]
, it doesn't match the firstfunction. In the template case,
T
resolves tochar [2]
, which meansthat the final argument type is
char (&a)[2][2]
. (You can think of itas the
T
becoming the equivalent of atypedef
tochar[2]
, andexpand the argument type based on that.)
T
将解析为char*
char[2]
,因此您的模板应该不会有任何问题功能。编辑:感谢詹姆斯指出这一点。
T
will resolve tochar*
char[2]
and as such there should not be any problems with your templated function.Edit: Thanks James for pointing that out.