您的位置:首页 > 编程语言 > C语言/C++

C++Primer第五版 第十六章习题答案(31~40)

2017-03-17 09:14 295 查看
31:unique_p是保存删除器函数的指针,所以需要一次跳转操作,并不会内联而是跳转

32:知识点1:从函数实参到模版实参的过程被称为模版实参推断,在这个过程中,可能会发生类型转换

知识点2:只有很有限的几种方式会发生类型转换

1:非const对象的引用或者指针到const对象的引用或者指针(const到非const是不合法的)(顶层const会被忽略)

2:若函数参数不是引用的类型,则可以进行函数或者数组的指针类型转换,我们可以用函数实参或者数组实参转化为对应指针

知识点3:算术类型转换不能支持模版函数的类型转换,若我们想要两个不同类型的参数,定义两个不同的模版参数即可

答案:在模版推断的过程中,编译器根据函数调用的实参类型来寻找模版实参,用这些模版实参生成的函数版本与给定的函数调用匹配

33:见知识点2

34:这里的字符串并不是string类型,而是根据长度判断的char
,若长度不同,则类型也不同,并且非const类型的引用或指针可以转换为const类型

所以(a)不合法(b)合法

35:知识点:函数模版也可以有用普通类型定义的参数,不使用T而使用int等等,这些参数可以进行正常的类型转换

(a):合法,第一个为char,即为T,第二个为char [1],可以进行类型转换

(b):合法,T为double,clac第二个参数为普通类型的int,可以进行算数类型转换

(c):不合法,一个char,一个char[1]

(d):不合法,一个double一个float,无法进行类型转换

36:知识点:在类型转换之前需要先判断参数类型是否相同!

(a):合法,T为 int*

(b):合法,T1和T2都为int*

(c):合法,顶层const会被忽略掉,T为int*

(d):合法,T1和T2都为int*

(e):不合法,首先需要判断实参的类型是否相同,再判断类型是否可转换,两参数一个为const一个非const

(f):hefa,T1和T2都为int*

37:知识点1:我们可以通过用户来控制模版的实例化,通常有两个原因:

1:模版实参作为函数的返回类型,传入的函数实参不能推断出函数的返回类型

2:我们希望可以参数指定类型,进行类型转换。

知识点2:显式模版实参,位于函数名后,参数列表之前,注意其函数模版实参是按从左至右顺序进行匹配的,之后尾部的参数可以忽略(忽略的前提是可以通过传入的实参进行推断),所以不要将最后的参数作为返回类型,否则需要将所有的模版实参进行显式的初始化

知识点3:对于模版实参显示指定了的函数参数,可以进行正常的类型转换

虽然max两个实参不同,但是我们可以通过显示的模版实参进行修改,指定了参数之后,传入参数可以不同,但是转换结果必须相同,可以进行类型转换

max<int>(a,b);//将b的类型强制转换为int


38:该函数接收的实参是迭代器或指针,如果不给出实参类型,那么就不知道分配内存的大小

39:

char[]会被转换为string

compare<string>("sss","aaa")


40:知识点:当我们想指定函数的返回类型时,使用显式模版实参是非常有效的,但是可能会给用户带来额外的负担,而且可能还会带来错误,比如返回值若是序列中的一个元素(接收的参数是序列的迭代器),我们可以使用尾置返回类型,decltype(something)来获取该something的类型,something的类型是函数的返回值类型。使用方式是在参数列表后加箭头+decltype(),而函数类型我们可以使用auto代替

结合以上知识点,由于需要decltype推断传入表达式的类型,所以该实参类型需要支持迭代器+的操作(该操作是右结合律,首先要进行迭代器加的操作,再解引用)

返回类型取决于解引用之后的类型
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息