系列文章目录
C++ primer plus 第一节 步入C++-CSDN博客
C++ primer plus 第二节 hello world刨析-CSDN博客
C++ primer plus 第三节 数据处理-CSDN博客
C++ primer plus 第四节 复合类型-CSDN博客
C++ primer plus 第五节 循环-CSDN博客
C++ primier plus 第七节 函数探幽第一部分-CSDN博客
C++ primier plus 函数探幽第二部分-CSDN博客
文章目录
-
目录
系列文章目录
前言
一 编译器选择使用哪个函数版本
总结
前言
如果你坚持阅读到这里配合书本,那么你也是一个强者了,加油一起hard
一 编译器选择使用哪个函数版本
对于函数重载、函数模板和函数模板重载.C++需要(且有〉 一个定义良好的策略,来决定为函数调 用使用哪一个函数定义,尤其是有多个参数时。这个过程称为重载解析 (overloading resolution),详细解释这个策略将需要将近一章的篇幅, 因此我们先大致了解一下这个过程是如何进行的
• 第1步:创建候选函数列表。其中包含与被调用函数的名称相同的函数和模板函数
• 第2步:使用候选函数列表创建可行函数列表。 这些都是参数数目正确的函数,为此有一个隐式转换序列,其中包括实参类型与相应的形参类型完全匹配的情况。 例如,使用 float参数的函数调 用可以将该参数转换为 double. 从而与 double 形参匹配,而模板可以为 float生成一个实例
• 第3步:确定是否有最佳的可行函数。如果有,则使用它,否则该函数调用出错
有没有发现这个跟我们之前学过的源代码进入到链接操作的时候差不多,链接不是会生成一个符号表嘛,这里生成一个函数列表,这个函数列表还是包括隐式转换序列的函数的,因为变成了实例化
下面我们来分析一个例子
首先我们输入了一个b字符,然后进行挑选这个要使用哪一个函数
接下来,编译器必须确定哪个可行函数是最佳的
它查看为使函数调用参数与可行的候选函数的参数 匹配所需要进行的转换。通常,从最佳到最差的顺序如下所述
1. 完全匹配,但常规函数优先于模板。
2. 提升转换(例如, char和 shorts 自动转换为时, float 自动转换为 double)。 3. 标准转换(例如, int转换为 char, long转换为 double)
4. 用户定义的转换,如类声明中定义的转换
我们根据这个来进行分析,首席按这个就是b嘛,这个4和5肯定是不可以的,,因为整数类型不能 被隐式地转换(即没有显式强制类型转换〉为指针类型,所以这个4和5直接被跳过
函数#1 优于函数#2, 因为 char到int的转换是提升转换,其实这个原本就是有一个整形提升的,而char到 float 的转换 是标准转换。函数的#3函数的#5和函数#6都优于函数#1 的,因为它们都是完全匹配的。 #3和#5优于#6,因为#6函数是模板
那么什么是完全匹配,什么是最佳匹配?
这个const是怎么理解呢?其实就是这个const只是适用于指针和引用,因为我们知道const修饰如果不匹配则会进行创建一个临时变量
其实作者觉得这个对于我们不需要进行深入研究,只需要有这个存在,我们现在学了也会忘记,那么我们九就只要有这个操作,后面在开发的过程中再来看这个规则就好了
总结
介绍了编译器使用哪一个函数的版本