作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
使用 C++ 模板知道 C 风格数组的长度,我们需要这个:
#include<stdio.h>
template<class T,size_t N>
size_t length(T (&a)[N]){ return N; }
int main() {
int fd[2];
printf("%lld\n", length(fd));;
return 0;
}
有效,打印 2
。我的问题是关于语法。
在length
的声明中,为什么参数应该是(&a)[N]
,而a[N]
不是'不工作?
如果我改成
template<class T,size_t N>
size_t length(T a[N]){ return N; }
gcc 会说:
template argument deduction/substitution failed:
couldn't deduce template parameter 'N'
为什么这里需要一个额外的&
和一对围绕数组标识符的大括号,这背后的模板规则/语法规则是什么?
感谢详细的解释。
最佳答案
在这个函数声明中
template<class T,size_t N>
size_t length(T a[N]){ return N; }
编译器将数组类型的参数调整为指向数组元素类型的指针。
也就是说这个声明实际上等同于
template<class T,size_t N>
size_t length(T *a){ return N; }
另一方面,在这个调用中用作参数表达式的数组
length(fd)
隐式转换为指向其第一个元素的指针。
所以编译器无法推导出模板非类型参数N的值。
当参数声明为引用时,不会发生上述调整和隐式转换。该引用用作数组的别名。
注意使用C函数printf
输出无符号整数类型size_t
的对象需要使用转换说明符zu
而不是 lld
。
关于c++ - 为什么 C++ 模板数组长度推导需要类似于 "f(T (&a)[N]"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72777348/
我是一名优秀的程序员,十分优秀!