c Templates讀書筆記 9 12章

2021-06-21 09:16:40 字數 4134 閱讀 3878

第9章模板中的名稱

1. 兩個概念:(1)受限名稱(2)依賴名稱p115

2. 名稱的分類(1)識別符號identifier (2)運算子id operator-function-id (3)型別轉換id conversion-function-id (4)模板id template-id (5)非受限id unqualified-id (6)受限id qualified-id (7)受限名稱qualified-name (8)非受限名稱unqualified-name (9) 依賴型名稱dependent name (10)非依賴型名稱nondependent name . p116

3. 受限名稱的查詢在乙個受限的作用域內,如果該作用域是乙個類,查詢範圍可以達到它的基類。p117

4. 非受限名稱的查詢會在所有外圍類中逐層進行。p118

5. adl argument-dependent lookup p118

6. 不適用adl的情況,受限名稱,呼叫函式用括號括起來;對於成員函式或者型別名稱,普通函式能找到。p119

7. 非受限名稱後面的括號裡有乙個或多個表示式,那麼adl會查詢其實參的associated class和associated namespace;p119

8.關於associated class 和associated namespace

1) 對於基本型別,該集合為空

2)對於指標和陣列型別,該集合是他們所引用型別的associated calss 和associated namespace

3)對於列舉型別,associated namespace指的是列舉型別所在的namespace,對於類成員,associated class指的是該類。**包括全域性namespace ?包括基類?

4)對於class型別,associated class集合包括:該class本身,他的外圍型別,直接基類和間接基類。associated namespace包括該類所在的namespace。如果該類是某個類模板的例項,還包括該類模板宣告所在的class 和namespace。

5 )對於函式型別,該集合包括函式引數和返回值的associated class 和associated namespace。

6)對於類x的成員指標包括,該成員相關的 associated class 和associated namespace 和x 的associated class 和associated namespace  p119

9. adl忽視using-directive。p120 **

10.友元函式的初次宣告在類中,則其宣告在外圍類作用域中不可見,但是通過adl可以使它可見,使用adl之後小心重定義。p121

11.非受限名稱後面沒有緊跟模板實參,是不會被看成是模板名稱的。解決辦法是給他加上作用域限定符:: 。p123

12.maximum munch掃瞄原則。p125***

13.typename使用:

1)名稱出現在乙個模板中

2)名稱是受限的。

3)名稱不是用於指定基類繼承的列表中,也不是位於引入的建構函式成員初始化列表中。

4)名稱依賴於模板引數。(指定必須新增typename還是可省略)p126

14.如果限定符前面的名稱依賴於某個模板引數,且後面緊跟的是乙個template-id,那麼就需要使用template 。p128

15. 使用using-declaration引入名字空間不會涉及到上下文的問題。p129

16. 使用using-declaration引入類能力是有限的,只能引入基類中的名稱,有點類似於快捷方式。p129

17. 如果使用using-declaration引入的依賴型名稱是乙個型別,則必須使用typename關鍵字,如:using typename bxt::mystery;     p130

18. 關於顯示模板實參和adl,編譯器會把<>看做小於號和大於號,因為無法判斷id乙個template-id 。p130

19.對於模板中的非依賴型基類,如果在他的派生類中查詢乙個非受限名稱,它會先查詢這個非依賴基類,然後再查詢模板的實參列表。p131

20.非依賴型名稱會在看到時立即查詢,但是不會在基類中進行查詢。p132

21.可以通過將非依賴型名稱變為乙個依賴型名稱,來延遲該名稱的查詢。this-> 或者c::  。p133

第11章模板的實參演繹

1.對於匹配型別a ,和引數化型別p: a.

如果被宣告的引數是乙個引用,那麼p就是所引用的型別,a仍然是實參的型別。 b.

如果被宣告的型別不是乙個引用,p就是所宣告的型別,a仍然是實參的型別。 c.

若果這個引數型別是陣列或者函式型別,還會進行decay轉型,轉化為指標型別;同時還會忽略高層次的const和volatile限定符。p164 **

2.對於引用型別,是不會進行decay轉型的。例如:

templatet const& max( t const& a, t const& b);

3.不能作為演繹上下文的包括: a.

受限的型別名稱 b.

模板引數還有其他成分的非型別表示式p167  ****

4.兩種特殊情況: a.

去函式模板位址。p為函式模板宣告的引數化型別。a為函式指標指定的型別。 b.

檔轉型運算子模板。p為轉型運算子返回的型別。a為試圖轉型的型別。p167

5.可接受的實參轉型 a.

如果原來宣告的引數是乙個引用引數,那麼被替換的p型別可以比a型別多乙個const或者volatile.

b.如果a型別是指標型別或者成員指標型別,那麼他可以進行限定符轉型,就是新增const或volatile,轉化為被替換的p型別。 c.

當演繹過程不涉及到轉型運算子石被替換的p型別可以使a型別的基類,或者指向a指向類的基類的指標。p 168

6.模板的實參演繹只能使用者函式模板或者成員函式模板,不能應用於類模板。p169

7.預設的函式模板實參不能作為實參演繹。p170

8.預設的函式模板實參如果沒有使用,則遵循sfinae原則。p170

9.barton-nackman方法**

第12章特化與過載

1.模板的特化與函式模板的過載,類模板不支援過載,函式不支援區域性特化,但是過載可以替換該功能。p177

2.不僅同名模板可以同時存在,他們各自的例項化體也可以同時存在,即使他們擁有一樣的引數和返回值。p179

3.函式簽名: a.

非受限函式名稱(或者產生自函式模板的這類名稱)。 b.

函式名稱所屬的類作用域或者名字空間作用域;如果函式名稱是具有內部鏈結的,還包括該名稱宣告所在的翻譯單元。 c.

函式的const、volatile或者const volatile限定符(前提是它是乙個具有這類限定符的成員函式. **) d.

函式引數的型別(如果這個引數產生自函式模板,那麼指的是模板引數被替換之前的型別**) e.

如果這個函式產生自函式模板,那麼包括他的返回型別。 f.

如果這個函式式產生自模板,那麼包括模板引數和模板實參。p180

4.正式的排序原則p183***

5.模板函式可以和非模板函式同時過載,但是當其他條件都一樣時,實際呼叫優先選擇非模板函式。p185

6.以前置宣告的方式全特化模板,不需要template<>; p187

7.應確認特化的宣告對所有泛型模板的使用者都可見。p189

8.全域性函式模板特化不能包含預設的實參值,然而可以直接應用這些預設實參值。p190

9.對於非內聯的全域性函式模板特化,他的定義只能出現一次。(那麼全域性類特化呢)**p191

10.全域性成員特化。p192

11.不同於普通類的成員函式和靜態成員變數,針對於類模板的特化,非定義的類外宣告在c++中是合法的。(目的是為了把定義放到單獨的編譯單元中)p193

12.區域性特化遞迴時,應該新增乙個全特化作為終止點。p196

13.區域性特化引數列表和實參列表的一些約束: a.

區域性模板的實參必須和基本模板的相應引數是匹配的。 b.

區域性特化的引數列表不能具有預設引數;但區域性特化仍然可以使用基本類模板的預設引數。 c.

區域性模板的非型別實參只能是非型別值,或者是普通的非型別模板引數,不能使依賴型表示式如:2*n 。*

d.區域性特化的模板引數列表不能和基本模板的引數列表完全相同。p196

14.多個匹配程度一樣的區域性特化會造成二義性。

對於類模板區域性特化的

C primer 讀書筆記(9)

在函式宣告裡值得注意的一點是預設形參 default parameter 的宣告。預設形參即在呼叫函式時可以省略實參的形參,所以我覺得也可以翻譯成預設形參。在宣告函式時就顯式地給這些引數賦值了,如果沒有傳入實參,則直接使用預設值,如果傳入實參,就會覆蓋原來的預設值。有人可能會擔心,既然可以省略實參,...

《C Primer》讀書筆記(9)

1.運算子過載,當有的時候物件運算與正常運算子的操作意義相同時,為了 的簡潔,我們就可以使用運算子過載。比如乙個簡單的加法操作,沒有必要再寫乙個add方法,還是乙個 看著比較順眼。include stdafx.h include include using namespace std class a...

Effective cpp 讀書筆記9

當我們編寫乙個class template,而它所提供的 與此template相關的 函式支援 所有引數之隱式型別轉換時 請將那些函式定義為 class template內部的friend函式 個人理解 template實參推導過程中,從來不將隱式型別轉換函式納入考慮。這樣的轉換咋函式呼叫過程中確實...