C ++重载决策,用户定义的转换和功能模板

时间:2016-07-19 06:40:50

标签: c++ function templates implicit-conversion overload-resolution

使用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;
}

1 个答案:

答案 0 :(得分:7)

GCC是正确的,template argument deduction不考虑隐式转换。

  

类型推导不考虑隐式转换(上面列出的类型调整除外):这是重载解析的工作,稍后会发生。

对于您的代码,auto_ptr_refauto_ptr不匹配,模板参数T的扣除失败,因此功能模板x()将不会被考虑过载分辨率。