使用g ++ 3.4和4.7,我发现了以下奇怪的行为:
如果需要用户定义的转换,则函数模板不匹配,其中普通函数将是。 我在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;
}
答案 0 :(得分:7)
GCC是正确的,template argument deduction不考虑隐式转换。
类型推导不考虑隐式转换(上面列出的类型调整除外):这是重载解析的工作,稍后会发生。
对于您的代码,auto_ptr_ref
与auto_ptr
不匹配,模板参数T
的扣除失败,因此功能模板x()
将不会被考虑过载分辨率。