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
相关产品推荐
相关产品推荐

