ParamType是指针或者引用
型别推导规则
- 若表达式具有引用型别,先将引用部分忽略;
- 对表达式的型别和param的型别执行模式匹配,来决定T的型别;
param引用无const修饰
template<typename T>
void f(T& param);
int x = 1 ;
const int cx = x ;
const int& rx = x ;
f(x) ;
f(cx);
f(rx);
函数调用 | T的型别 | param的型别 |
---|
f(x) | int | int& |
f(cx) | const int | const int& |
f(rx) | const int | const int& |
param引用存在const修饰
template<typename T>
void f(const T& param);
int x = 1 ;
const int cx = x ;
const int& rx = x ;
f(x) ;
f(cx);
f(rx);
函数调用 | T的型别 | param的型别 |
---|
f(x) | int | const int& |
f(cx) | int | const int& |
f(rx) | int | const int& |
param指针无const修饰
template<typename T>
void f(T* param);
int x = 1 ;
const int* px = &x ;
f(x) ;
f(px);
函数调用 | T的型别 | param的型别 |
---|
f(x) | int | int* |
f(px) | const int | const int* |
param万能引用
template<typename T>
vodi f(T&& param);
int x = 1;
const int cx= x ;
const int& rx = x ;
f(x);
f(cx);
f(rx);
函数调用 | T的型别 | param的型别 |
---|
f(x) | int& | int& |
f(cx) | const int& | const int& |
f(rx) | const int& | const int& |
f(27) | int&& | int&& |
param非引用和指针,按值传递
template<typename T>
void f(T param);
int x = 1;
const int cx= x ;
const int& rx = x ;
const char* const px = "123";
f(x);
f(cx);
f(rx);
f(px);
函数调用 | T的型别 | param的型别 |
---|
f(x) | int | int |
f(cx) | int | int |
f(rx) | int | int |
f(27) | int | int |
f(px) | const char* | const char* |
数组实参
- 数组按值传递将会退化成指针;
- 如果保持数组的型别,则需要按引用方式传递实参
总结
- 在模板推导过程中,具有引用型别的实参会被当成非引用型别来处理即其引用性被忽略;
- 万能引用形参推导时,左值实参会进行特殊处理;
- 按值传递的推导时,若形参中带有const和valotaile修饰则会被忽略;
- 数组和函数型别的实参会退化成对应的指针,除非他们被用来初始化引用;