陣列實參 - 邊緣情況
陣列引用 - what? - 後期會繼續研讀並完善
以下內容根據effective modern c++ 條款1再結合自身理解而來(理解不對的還望指正,謝謝)
感謝作者 scott meyers帶來這麼好的書籍
```
templatevoid f(paramtype param);、
f(expr);
1. 編譯期間將推導出兩個型別: t, paramtype 分別對應的型別。
2. 往往兩個型別不一樣。因為paramtype中常含有修飾詞: const, &, && 等等
template void f(const t& param);
1. f(1); : t int, paramtype(const t&): const int &
2. 也許你會認為 t的型別就是expr的型別,但不總成立,因為t的型別不僅僅依賴 expr, 還依賴 paramtype的形式
```
如果expr具有引用型別,忽略它然後再通過expr與paramtype的型別來確定t的型別1) 引用
template void f(t& param);
ex:int a = 10; // a 的型別是 int
const int b = a; // b 的型別是 const int
const int &c = a; // c 的型別是 const int &
f(a); // paramtype型別: int &; t的型別: int
f(b); // paramtype型別:const int &, t的型別: const int
f(c); // expr有引用,忽略, paramtype型別:const int &, t的型別: const int
:請思考以上三種呼叫,在void f(t& param) 定義中修改param會發生什麼,如果可以的話。
: 新增
template void f(const t& param);
f(a); // t的型別: int; paramtype型別: int &
f(b); // t的型別: int; paramtype型別: const int &
f(c); // t的型別: int; paramtype型別: const int &
: 新增 void f(const t& param); 為什麼推導結果如上?(最優適配)
2) 指標 (忽略之前的模板函式)
template void f(t* param);
int a = 10; // 同上
int *px = &a;
const int *pa = &a;
f(&a); // t的型別: int; paramtype型別: int *
f(px); // t的型別: int; paramtype型別: int *
f(pa); // t的型別: int; paramtype型別: const int *
若 expr 是左值, t和paramtype均被推導為左值引用(廢話?)
若 expr 是右值, 則按照指標或引用(非萬能引用)的方式推導
template void f(t&& param);
int a = 8; // 同前
const int b = a; // 同前
const int &c = a; // 同前
f(a); // a是==左==值 - t的型別: int &; paramtype型別: const int &
f(b); // b是==左==值 - t的型別: const int &; paramtype型別: const int &
f(c); // c是==左==值 - t的型別: const int &; paramtype型別: const int &
f(8); // 8是==右==值 - t的型別: int; paramtype型別: int &&
該情況下意味無論傳入什麼,param僅僅是它的乙個副本(值同,位址不同, 全新的物件)
一如之前,若expr具有引用型別,忽略引用部分
忽略引用性後, 若expr是 const 或 volatile (一般用於裝置驅動)物件同樣忽略
template void f(t param);
ex:int a = 8; // 同前
const int b = a; // 同前
const int &c = a; // 同前
f(a); // paramtype與t的型別均是: int
f(b); // paramtype與t的型別均是: int
f(c); // paramtype與t的型別均是: int
const int * const pt = &a;
f(pt); // paramtype與t的型別均是: const int *
儘管函式無法宣告真正的的陣列型別的形參,但是可以宣告形參為陣列的引用。
```
template void f(t ¶m); // 沒錯,老夥計
: 這種情況下會被推導出真正的陣列型別形參,這個型別也會包含陣列的長度
```1) 先看乙個又意思的模組
```template constexpr std::size_t arraysize(t (&)[n]) noexcept
constexpr: 使得返回值在編譯期間就可以使用,從而宣告另外乙個陣列時,可以指定大小與另外乙個陣列的相同。
const char name = "tiany";
char aliasname[arraysize(name)]; // 候老提議使用 std::array 吧
noexcept: 幫助編譯器生成更好的目標**
```
可退化成指標之物 - 後期會繼續研讀並完善
針對陣列向指標退化的一切討論均適用函式向函式指標的退化
template void f1(t param);
template void f2(t& param);
void func(int, double);
f1(func); // t 和 paramtype的型別: void (*)(int, double);
f2(func); // t 和 paramtype的型別: void (&)(int, double);
模板型別推導 auto推導
effective modern c 果然是神書,乾貨滿滿,簡單記錄下。item1 模板推倒 典型的模板函式 temlate void fn paramtype param 要記住的東西 在模板型別推導的時候,有引用特性的引數的引用特性會被忽略 在推導通用引用引數的時候,左值會被特殊處理 在推導按值...
模板型別推導
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...
函式型別推導
乙個普通函式 int func int a func的型別是int int int int 是函式指標型別,也即 func的型別。進行如下實驗 void func123 int a template class t void setfunc t t,int a pass by value templ...