内容参考《Effective Modern C++》中的条款1
int x =27;
const int cx = x;
const int& rx = x;
const int* p = &x;
1.ParamType是个指针或引用,但不是个万能引用(去引用不去const)
template
void f(T& param);
f(x); //T型别是int, param的型别是int&
f(cx); //T型别是const int, param的型别是const int&
f(rx); //T型别是const int, param的型别是const int&
template
void f(const T& param);
f(x); //T型别是int, param的型别是const int&
f(cx); //T型别是int, param的型别是const int&
f(rx); //T型别是int, param的型别是const int&
template
void f(T* param);
f(&x); //T型别是int, param的型别是int*
f(px); //T型别是const int, param的型别是const int*
template
void f(const T* param);
f(&x); //T型别是int, param的型别是int*
f(px); //T型别是int, param的型别是const int*
2.ParamType是个万能引用
template
void f(T&& param);
f(x);//T型别是int&, param的型别是int&
f(cx);//T型别是const int&, param的型别是const int&
f(rx);//T型别是const int&, param的型别是const int&,(rx是个左值)
f(27);//T型别是int, param的型别是int&&
template
void f(const T&& param);//1.这个在自行推导时是右值引用而不是万能引用.
//2.但f
const T; const T&; const T&&;
只要T是引用类型(如int&或int&&)或指针(如int*),则const修饰的就是整个引用(以int&举例,上面的三种情况即int& const, int& const &, int& const&&又由于引用类型本身就具有const属性,所以const被忽略,再加上应用折叠三种情况均变成了int&)或指针(以int*举例,上面的三种情况即int* const,int* const&, int* const&&)
3.ParamType既非指针也非引用(去引用和去引用后(若有引用)的顶层const,只有这种情况才去const)
template
void f(T param); //按值传递
f(x);//T型别是int, param的型别是int
f(cx);//T型别是int, param的型别是int
f(rx);//T型别是int, param的型别是int
f(px);//T型别是const int*, param的型别是const int*
template
void f(const T param); //按值传递
f(x);//T型别是int, param的型别是const int
f(cx);//T型别是int, param的型别是const int
f(rx);//T型别是int, param的型别是const int
f(px);//T型别是const int*, param的型别是const int* const