加入收藏 | 设为首页 | 会员中心 | 我要投稿 威海站长网 (https://www.0631zz.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

C++Primer第5版16.2.1节练习(类型转换与模板类型参数)

发布时间:2023-01-14 10:01:16 所属栏目:MsSql教程 来源:网络
导读: 练习16.32:在模板实参推断过程中发生了什么?
答:对于一个函数模板,当我们调用它时,编译器会利用调用中的函数实参来推断其模板参数,这些模板实参实例化出的版本与我们的函数调用应该是

练习16.32:在模板实参推断过程中发生了什么?

答:对于一个函数模板,当我们调用它时,编译器会利用调用中的函数实参来推断其模板参数,这些模板实参实例化出的版本与我们的函数调用应该是最匹配的版本,这个过程就称为模板实参推断。

练习16.33:指出在模板实参推断过程中运行对函数实参进行的两种类型转换。

答:在模板实参推断过程中Mssq类型转换函数,如果函数形参的类型使用了模板类型参数,则只允许进行两种类型转换。

1、const转换:可以将一个非const对象的引用(或指针)传递给一个const对象(或指针)形参。

2、数组或函数到指针的转换:如果函数形参不是引用类型,则可以对数组或函数类型的实参应用正常的指针转换。一个数组实参可以转为为一个指向其首元素的指针。类似的,一个函数实参可以转换为一个该函数类型的指针。

练习16.34:对下面的代码解释每个调用是否合法。如果合法,T的类型是什么?如果不合法,为什么?

template int compare T calc(const T&, const T&);
(a) compare("hi","world");    (b) compare ("bye","dad");

答:在模板实参推断过程中,允许数组到指针的转换。但是,如果形参是一个引用,则数组不会转换为一个指针。因此,两个调用都是非法的。

练习16.35:下面调研中哪些是错误的(如果有的话)?如果调用合法,T的类型是什么?如果调用不合法,问题何在?

template T calc(T, int);
template 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) //调用合法,T的类型是char,第二个参数将char转换为int。

(b) //调用合法,T的类型是double,第二个参数将float转换为int。

(c) //调用合法,T的类型是char。

(d) //调用不合法,因为T的类型可能是double也可能是float。

练习16.36:进行下面的调用会发生什么?

template  f1(T,T);
template  f2(T1,T2);
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) 调用合法,T被推断为int*。

(b) 调用合法,T1、T2的类型为int*。

(c) 调用合法,T被推断为const int *。

(d) 调用合法,T1、T2被推断为const int*。

(e)调用非法,T无法确定要推断为int*还是const int *。

(f) 调用合法,T1被推断为int*,T2被推断为const int *。

(编辑:威海站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!