实参和形参存在一个类型匹配的过程,不同的类型匹配有不同的优先级:精确匹配>提升匹配>标准转换匹配>用户自定义转换匹配。以下分别说说这几种情况:
1、精确匹配
有左值转换匹配和限定符转换匹配两种,左值转换匹配又分为:左值到右值、数组到指针、函数到指针。数组、函数都是类型,数组类型不是指针类型,函数类型也不是指针类型,但由于函数形参类型无数组、函数这来两种类型,因此存在数组到指针、函数到指针的转换。这些转换都属于精确匹配。限定符转换只作用在指针所指向对象,对于指针本身的限定符则不进行任何转换,当作完全一致匹配处理。限定符包含const、volatile。以下例子说明限定符转换:
void ff(const int *);
void f(int * const);
int *p = NULL;
f(p);//无限定符转换,一致匹配
ff(p);//限定符转换,属于精确匹配
2、提升匹配
包括整值类型(char,unsigned short,short,int,unsigned int, long, unsigned long)间的提升、浮点类型间的提升、枚举类型或布尔型到int的提升。所有的提升都保证提升后的类型能够表示未提升前类型的所有值。
3、标准转换匹配
整值类型转换匹配、浮点类型转换匹配、浮点--整值类型转换匹配、指针转换匹配、布尔转换匹配。标准转换匹配不能保证数据的安全,即不能保证转换后不发生截断或精度损失情况。