6

隨着克++ 3.4和4.7我觀察到以下奇怪的行爲:C++重載分辨率,用戶定義的轉化率和功能模板

如果用戶定義的轉換是必要的函數模板不匹配,其中,一個普通的功能會。 我無法在C++ 98標準中找到相應的規則。 g ++是否正確,(如我所假設的)?或者它是一個錯誤?

template <class T> 
int x(auto_ptr_ref<T> p) 
{ 
    return 1; 
} 
// this would match 
/* 
int x(auto_ptr_ref<int> p) 
{ 
    return 2; 
} 
*/ 
void dummy() 
{ 
    cout << x(auto_ptr<int>()) << endl; 
} 

回答

7

GCC正確,template argument deduction不考慮隱式轉換。

類型扣除不考慮隱式轉換(除上面列出的類型調整外):這是重載解析的工作,稍後會發生。

爲您的代碼,auto_ptr_ref不匹配對auto_ptr,模板參數T失敗扣,因此函數模板x()將無法​​在所有的考慮重載決議。