练习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*);