1.若T为引用,但不是万能引用:
template<class T>
void fun(T&);
a)T不会被推导为引用类型,形参会被推断为引用类型(&类型)
b)如果实参带const,实参的const属性会成为模板T的组成部分,且形参也会带上const属性(const &)
2.若T为引用,且带有const属性
template<class T>
void fun(const T&);
a) T不会被推断为const类型(即使实参是const类型),也不会被推导为引用类型,而形参会被推断为const&类型 (无论实参是否是const类型)
3.若T为指针
template<class T>
void fun(T*);
a)T不会被推断为指针类型,如果实参带const,那么T也会带const
b)形参会被推断为指针,类型和实参相同
4.若T为万能引用
template<class T>
void fun(T&&);
a) 若实参是左值,则T和实参都被推断为引用类型
b)若实参是const 左值,T和实参被推断为const&类型
c)若实参是引用,T和实参被推断为引用类型
d)若实参是右值,则T被推倒为正常类型,而形参被推断为&&(万能引用)类型
5.若T是传值的方式
template<class T>
void fun(T);
a)const类型不会传进T和形参,因为是一个新的副本
b)如果传指针进去,例如const char* const point=ptr;
第二个const不会传进去,第一个const会在形参和T中