C 模板型別推導

2021-10-08 06:55:40 字數 2249 閱讀 9450

內容參考《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&&就變成了int&(原因:(int& const &&) ,1.const修飾整個int&,由於引用本身就是const的所以去掉const,變成(int&)&&, 2.引用摺疊,所以param的型別就變成了int&).如果實參和int&不匹配(如傳乙個const int cx作為實參),編譯時就會報錯。

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

模板型別推導

param引用無const修飾template 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 intint f cx const int const int f rx...

模板型別推導 auto推導

effective modern c 果然是神書,乾貨滿滿,簡單記錄下。item1 模板推倒 典型的模板函式 temlate void fn paramtype param 要記住的東西 在模板型別推導的時候,有引用特性的引數的引用特性會被忽略 在推導通用引用引數的時候,左值會被特殊處理 在推導按值...

C 模板函式的型別推導

我在用泛型程式設計寫二維vector的排序模板時,寫出這樣乙個 vector的字典序比較,v1 v2是false templatebool cmp vector v1,vector v2 編譯結果 1 c program files x86 microsoft visual studio 10.0 ...