为什么模板函数接收带有 1D 引用的 2D 数组,而普通函数则不接收

发布于 2024-11-09 18:45:42 字数 367 浏览 3 评论 0原文

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

清泪尽 2024-11-16 18:45:42

因为c的类型不是char [2],所以它与第一个不匹配
功能。在模板情况下,T 解析为 char [2],这意味着
最终参数类型为 char (&a)[2][2]。 (你可以这样想
因为 T 相当于 typedefchar[2],并且
在此基础上扩展参数类型。)

Because the type of c isn't char [2], it doesn't match the first
function. In the template case, T resolves to char [2], which means
that the final argument type is char (&a)[2][2]. (You can think of it
as the T becoming the equivalent of a typedef to char[2], and
expand the argument type based on that.)

过期以后 2024-11-16 18:45:42

T 将解析为 char*char[2] ,因此您的模板应该不会有任何问题功能。

编辑:感谢詹姆斯指出这一点。

T will resolve to char*char[2] and as such there should not be any problems with your templated function.

Edit: Thanks James for pointing that out.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文