gpt4 book ai didi

c++ - 为什么 C++ 模板数组长度推导需要类似于 "f(T (&a)[N]"?

转载 作者:行者123 更新时间:2023-12-01 22:57:05 30 4
gpt4 key购买 nike

使用 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/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com