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

C++函数模板为何无需显式指定Size即可推导std::array大小?

为什么调用模板函数Print时无需显式指定模板参数Size?

首先来看你提供的代码:

#include <iostream>
#include <array>
#define print(x) std::cout << x
#define println(x) std::cout << x << std::endl
template<std::size_t Size>
void Print(std::array<int, Size>& arr) {
    for (int i = 0; i < Size; i++) {
        println(arr[i]);
    }
}
int main() {
    std::array<int, 5> arr = {1, 2, 3, 4, 5};
    Print(arr);
}

你疑惑的点其实是C++里模板参数推导(template argument deduction)这个核心特性在起作用。

说白了就是编译器足够聪明,能从你传递的函数实参里自动推断出模板参数的值。这里你传给Print的实参arr是std::array<int, 5>类型的,而函数模板的参数是std::array<int, Size>&——编译器会把这两个类型做匹配:既然实参的数组大小是5,那模板参数Size自然就被推导为5了。

这个机制的设计目的就是让代码更简洁,避免重复书写那些编译器能自己搞定的参数。当然,如果遇到推导歧义、或者模板参数和函数参数没有直接关联的情况,你还是得显式指定模板参数,但像你这个场景,类型信息足够明确,编译器完全能自动处理。

内容的提问来源于stack exchange,提问作者AM Z

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 18:22:28