徹底搞定模板型別推導

2021-09-22 18:24:35 字數 2849 閱讀 1393

templatevoid f(t& param); //t&
templatevoid f(t&& param); //t&&
templatevoid f(t param); // just t
對於paramtype是乙個指標或引用,expr型別(傳入的實參型別)去掉引用便是t型別。如:

int x = 27;    // x is an int

f(x);          // t is int, param's type is int&

x的型別是int,去掉引用(本身就沒有),是int,所以t為int,將int帶入t&,便是int&,所以paramtype 就是int&

const int cx = x;   // cx is a const int

f(cx);              // t is const int, param's type is const int&

cx的型別是const int,去掉引用(本身就沒有),是const int,所以t是const int,將const int帶入t&,paramtype便是const int&

const int& rx = x; // rx is a reference to x as a const int

f(rx);             // t is const int, param's type is const int&

rx的型別是const int& ,去掉引用,是const int,所以t是const int,將const int帶入t&,paramtype便是const int&

paramtype是萬能引用,分為兩步:

第一步expr型別(傳入的實參型別)去掉引用,得到t

如果expr型別是左值,給t再加上乙個&

int x = 27; // as before

f(x);       // x is lvalue, so t is int&, param's type is also int&

expr的型別,也就是實參x的型別是int,去掉所有&(本身就沒有),型別是int

因為x是左值,所以再加上乙個&,最終t是int&

所以將int &帶入t&&,paramtype就是int& &&,引用摺疊後就是int&

const int cx = x; // as before

f(cx);            // cx is lvalue, so t is const int&, param's type is also const int&

expr的型別,也就是實參cx的型別是const int,去掉所有&(本身就沒有),型別是const int

因為cx是左值,所以再加上乙個&,最終t是const int&

所以將const int &帶入t&&,paramtype就是const int& &&,引用摺疊後就是const int&

const int& rx = x; // as before

f(rx);             // rx is lvalue, so t is const int&, param's type is also const int&

expr的型別,也就是實參rx的型別是const int,去掉所有&(本身就沒有),型別是const int

因為cx是左值,所以再加上乙個&,最終t是const int&

所以將const int &帶入t&&,paramtype就是const int& &&,引用摺疊後就是const int&

f(27); // 27 is rvalue, so t is int, param's type is therefore int&&
expr的型別,也就是實參27的型別是int,去掉所有&(本身就沒有),型別是int

因為27是右值,沒有額外操作,t就是int

所以將int帶入t&&,paramtype就是 int&&

paramtype不是指標,也不是引用,直接忽略掉expr中所有的&、const、volatile便是t:

int x = 27; // as before

f(x);       // t's and param's types are both int

x的型別是int,去掉&、const、volatile(本身就沒有),是int,所以t為int,將int帶入t,便是int,所以paramtype 就是int

const int cx = x; // as before

f(cx);            // t's and param's types are again both int

cx的型別是const int,去掉&、const、volatile,是int,所以t為int,將int帶入t,便是int,所以paramtype 就是int

const int& rx = x;    // as before

f(rx);                // t's and param's types are still both int

rx的型別是const int&,去掉&、const、volatile,是int,所以t為int,將int帶入t,便是int,所以paramtype 就是int

模板型別推導

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 模板型別推導

內容參考 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 ...