C STL型別推導

2021-10-19 08:37:54 字數 3709 閱讀 7904

陣列實參 - 邊緣情況

陣列引用 - 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...