第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實參推導過程中,從來不將隱式型別轉換函式納入考慮。這樣的轉換咋函式呼叫過程中確實...