第十六章 16.2.1节练习

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值