練習16.32
在模闆實參推斷過程中發生了什麼?
解答:
【引用】在模闆實參推斷過程中改變一起使用函數調用中的實參類型來尋找模闆實參,用這些模闆實參生成的函數版本與給定的函數調用最為比對。
練習16.33
指出在模闆實參推斷過程中允許對函數實參進行的兩種類型轉換。
解答:
1. const轉換,可以将一個非const對象的引用(或指針)傳遞給一個const的引用(或指針)形參。
2. 數組或函數指針轉換:如果函數形參不是引用類型,則可以對數組或函數類型的實參應用正常的指針轉換。一個數組實參可以轉換為一個指向其首元素的指針。類似的,一個函數實參可以轉換為一個該函數類型的指針。
練習16.34
對下面的代碼解釋每個調用是否合法。如果合法,T的類型是什麼?如果不合法,為什麼?
template<class T> int compare(const T&, const T&);
(a) compare("hi", "world");
(b) compare("bye", "dad");
解答:
(a)不合法,兩個實參的類型不一緻,error: no matching function for call to ‘compare(const char [3], const char [6])’
(b)合法,compare(const char [4], const char [4]) (感謝asjdhs同學的提醒)
練習16.35
下面調用中哪些是錯誤的(如果有的話)?如果調用合法,T的類型是什麼?如果調用不合法,問題何在?
template <typename T> T calc(T, int);
template <typename T> T fcn(T, T);
double d; float f; char c;
(a) calc(c, 'c');
(b) calc(d, f);
(c) fcn(c, 'c');
(d) fcn(d, f);
解答:
(a) 合法,類型為char
(b) 合法,類型為double
(c) 合法,類型為char
(d) 不合法,這裡無法确定T的類型是float還是double
練習16.36
進行下面的調用會發生什麼:
template <typename T> void f1(T, T);
template <typename T1, typename T2> void f2(T1, T2); //書中函數定義沒有傳回值,在C++不允許這樣聲明函數。
int i = 0, j = 42, *p1 = &i, *p2 = &j;
const int *cp1 = &i, *cp2 = &j;
(a) f1(p1, p2);
(b) f2(p1, p2);
(c) f1(cp1, cp2);
(d) f2(cp1, cp2);
(e) f1(p1, cp1);
(f) f2(p1, cp1);
解答:
(a) f1(int*, int*);
(b) f2(int*, int*);
(c) f1(const int*, const int*);
(d) f2(const int*, const int*);
(e) f1(int*, const int*); 這個使用就不合法
(f) f2(int*, const int*);