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两个实参不同,但是我们可以通过显示的模版实参进行修改,指定了参数之后,传入参数可以不同,但是转换结果必须相同,可以进行类型转换
38:该函数接收的实参是迭代器或指针,如果不给出实参类型,那么就不知道分配内存的大小
39:
char[]会被转换为string
40:知识点:当我们想指定函数的返回类型时,使用显式模版实参是非常有效的,但是可能会给用户带来额外的负担,而且可能还会带来错误,比如返回值若是序列中的一个元素(接收的参数是序列的迭代器),我们可以使用尾置返回类型,decltype(something)来获取该something的类型,something的类型是函数的返回值类型。使用方式是在参数列表后加箭头+decltype(),而函数类型我们可以使用auto代替
结合以上知识点,由于需要decltype推断传入表达式的类型,所以该实参类型需要支持迭代器+的操作(该操作是右结合律,首先要进行迭代器加的操作,再解引用)
返回类型取决于解引用之后的类型
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推断传入表达式的类型,所以该实参类型需要支持迭代器+的操作(该操作是右结合律,首先要进行迭代器加的操作,再解引用)
返回类型取决于解引用之后的类型
相关文章推荐
- C++Primer第五版 第三章习题答案(31~40)
- C++Primer第五版 第九章习题答案(31~40)
- C++Primer第五版 第七章习题答案(31~40)
- C++Primer第五版 第十三章习题答案(31~40)
- C++Primer第五版 第六章习题答案(31~40)
- C++Primer第五版 第十五章习题答案(31~40)
- C++Primer第五版 第二章习题答案(31~41)
- C++Primer第五版 第四章习题答案(31~38)
- C++Primer第五版 第十六章习题答案(41~50)
- C++Primer第五版 第十六章习题答案(11~20)
- C++Primer第五版 第十六章习题答案(51~60)
- C++Primer第五版 第十六章习题答案(21~30)
- C++Primer第五版 第十章习题答案(31~40)
- C++Primer第五版 第十二章习题答案(31~33)
- C++Primer第五版 第十六章习题答案(1~10)
- C++Primer第五版——习题答案+详解(完整版)
- C++Primer第五版 第八章习题答案(11~14)
- C++Primer第五版 第九章习题答案(21~30)
- C++Primer 中文版 第五版 第四章课后习题答案
- C++Primer 中文版 第五版 第七章课后习题答案