模板的术语

Templates terminology

本文关键字:术语      更新时间:2023-10-16
template <typename T> void quark(T&& t) {
}

前面的代码有这样的解释:

调用quark(up)时,执行模板实参推导。quark()是一个带有模板形参T的函数模板,但是我们没有提供一个显式的模板实参(看起来像quark<X>(up))。相反,可以通过比较函数形参类型T&&与函数实参类型(字符串类型的左值)来推导模板实参。

谁能告诉我谁是谁在模板参数,模板参数,函数参数,函数参数?

参数和实参之间的区别可能是函数声明中写的类型参数和实参是实际传递给函数的实体?但是函数和模板args/pars之间的区别我甚至无法想象。

模板形参是T,模板实参是调用quark(up)时碰巧推导出的T。

函数形参为t,函数实参为up

模板参数为T。模板参数为实际类型,即T的值。

考虑这个,

template<typename T, typename U>
void f(T a, U b);
f<int,char>(10, 'A`);

这里TU是模板形参,intchar是模板实参。因为它是一个函数模板,你也可以分别说函数模板形参函数模板实参

ab为函数形参,10'A'为函数实参。

还要注意,在某些情况下函数模板参数可以由编译器推导出来:

f(10, 'A'); //template arguments can be deduced from 10 and 'A'

从函数参数10推导出Tint,从'A'推导出Uchar

有趣的区别是,有时编译器可以推断出函数模板参数,但它永远不能推断出函数参数!