C++模板类型推导

内容参考《Effective Modern C++》中的条款1

int x =27;
const int cx = x;
const int& rx = x;

const int* p = &x;

1.ParamType是个指针或引用,但不是个万能引用(去引用不去const

template<class T>

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<class T>

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<class T>

void f(T* param);

f(&x); //T型别是int, param的型别是int*

f(px); //T型别是const int, param的型别是const int*

template<class T>

void f(const T* param);

f(&x); //T型别是int, param的型别是int*

f(px); //T型别是int, param的型别是const int*

2.ParamType是个万能引用

template<class T>

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&&

 

注意1:

template<class T>

void f(const T&& param);//1.这个在自行推导时是右值引用而不是万能引用.

                                          //2.但f<int&>(实参)这样用const T&&就变成了int&(原因:(int& const &&) ,1.const修饰整个int&,由于引用本身就是const的所以去掉const,变成(int&)&&, 2.引用折叠,所以param的类型就变成了int&).如果实参和int&不匹配(如传一个const int cx作为实参),编译时就会报错。

注意2:

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<class T>

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<class T>

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

猜你喜欢

转载自blog.csdn.net/kh815/article/details/107444853
今日推荐