You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 16:25:34