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)被選為該調用的最佳可行函
數或首選函數