重载 参数转换

 extern void ff( int );
extern void ff( long, int = 0 );
int main() {
ff( 2L ); // 匹配 ff( long, 0 );
ff( 0, 0 ); // 匹配 ff( long, int );
ff( 0 ); // 匹配 ff( int );
ff( 3.14 ); // 错误: 二义
}

=============

extern int ff( char*, int );
extern int ff( int, int );
int main() {
ff( 0, 'a' ); // ff( int, int )
return 0;
}
由于下述原因有两个int 型的参数的函数ff()被选为最佳可行函数
1 它的第一个实参较好0 是int 型的参数的精确匹配而对于第一个ff(char*,int)函数
来说它需要一个指针标准转换序列来匹配char*型的参数
2 它们的第二个实参一样好实参a 的类型是char 两个函数的第二个参数的匹配
都要求一个提升等级的转换序列

 

这里还有另外一个例子
int compute( const int&, short );
int compute( int&, double );
extern int iobj;
int main() {

compute( iobj, 'c' ); // compute( int&, double )
return 0;
}
这两个函数compute(const int&,short)和compute(int&,double)都是可行函数由于下述原
因第二个函数被选为最佳可行函数
1 它的第一个实参较好第一个可行函数的引用初始化比较差因为它加入了一个const
限定修饰符而第二个可行函数的初始化没有加入const 限定修饰符
2 它们的第二个实参一样好实参c 的类型是char 要匹配两个函数的第二个参数
都要求一个标准转换等级的转换序列

 

#include <vector>
void manip( vector<int> & );
void manip( const vector<int> & );
vector<int> f();
extern vector<int> vec;
int main() {
manip( vec ); // 选择 manip( vector<int> & ) is selected
manip( f() ); // 选择 manip( const vector<int> & ) is selected
return 0;
}
在第一个调用中两个调用的引用初始化都是精确匹配但是该调用不是二义的因为
两个引用初始化都相同除了第二个加上了const 修饰符所以没有额外限定修饰的初始化
被认为是较好的初始化因此可行函数manip(vector<int>&)是第一个调用的最佳可行函数
在第二个调用中该调用只有一个可行函数manip(const vector<int>&) 因为实参是存
放函数f()返回值的临时单元所以该实参是一个右值它不能被用来初始化
manip(vector<int>&)的非const 引用参数因此对于第二个调用的最佳可行函数编译器只
考虑一个可行函数manip(const vector<int>&)

 

1 首先是一个从左值到右值的转换它从实参i 和j 中抽取值
2 通过一个标准转换把实参转换成相应的参数
因为每个转换序列都和另一个一样好所以该调用是二义的
int i, j;
extern long calc( long, long );
extern double calc( double, double );
void jj() {
// 错误: 二义, 没有最佳匹配
calc( i, j );
}

============

类型转换的等
级划分如下精确匹配好于提升提升好于标准转换

 

namespace libs_R_us {
int max( int, int );
double max( double, double );
}
// using 声明
using libs_R_us::max;
void func()
{
char c1, c2;
max( c1, c2 ); // 调用 libs_R_us::max( int, int )
}
在max()的调用中的实参是char 型的调用函数libs_R_us::max(int, int)的实参上的转换
序列如下
1a 因为该实参按值传递所以首先是从左值到右值转换它从实参c1 和c2 中抽取值
2a 提升转换将实参从char 转换到int
调用函数libs_R_us::max(double,double)的实参上的转换序列如下
1b 先应用一个从左值到右值的转换它从实参c1 和c2 抽取值
2b 浮点——整值标准转换将实参从char 转换成double
第一个转换序列的等级是提升序列中最差的转换而第二个转换序列的等级是标准
转换因为提升比标准转换好所以函数libs_R_us::max(int,int)被选为该调用的最佳可行函
数或最佳匹配函数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值