C++Primer第5版16.2.1节练习
练习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 *。 (编辑:鄂州站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 重学MySQL:谈一谈MySQL架构
- sql-server C 在启动脚本/配置文件中存储数据库密码的最佳方
- 在SQL SERVER中导致索引查找变成索引扫描的问题分析
- sql-server – 如何设置Zabbix来监控SQL Server故障转移主动
- sqlserver 错误602,未能在sysindexes中找到数据库 的解决办
- sql查询表中根据某列排序的任意行语句
- sqlserver中datetime和timestamp之间的区别?
- sql-server – SQL Server行长度
- 在Azure数据工厂中的管道中运行U-SQL活动时出错
- sql-server – 在SQL Server数据库中存储时间间隔的最佳方法