为何用T[N]替代T*时需引用?C++模板参数推导解析
为什么数组引用能让模板参数推导成功?
核心原因在于C++里的数组到指针的隐式退化规则:
当你把数组作为普通函数参数传递时(不带引用修饰),编译器会自动把数组类型转换成指向首元素的指针,数组原本的大小信息会直接丢失。
比如你定义int test[10];,调用不带引用的array_size(test)时,test会被转成int*,此时函数参数里的T[n]会被编译器等价处理成T*,模板只能推导出T=int,但n的大小完全没有传递过来,自然推导失败。而当函数参数是数组的引用
T(&)[n]时,不会触发数组的指针退化。编译器会直接把实参的完整数组类型(比如int[10])绑定到引用参数上,这样就能从数组类型里直接提取出T=int和n=10两个模板参数,推导自然成功。
正确的模板实现:
template <typename T, size_t n> constexpr size_t array_size(T(&) [n]) { return n; }
错误的模板实现(会触发退化):
template <typename T, size_t n> constexpr size_t array_size(T [n]) { return n; }
编译器会把这个版本的参数T[n]调整为T*,等价于:
template <typename T, size_t n> constexpr size_t array_size(T*) { return n; }
此时调用时没有任何信息能推导n,就会报出"couldn't deduce template parameter 'n'"的错误。
内容的提问来源于stack exchange,提问作者Cedric Martens
相关产品推荐
相关产品推荐

