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