C++重载解析、用户定义的转换和函数模板

C++ Overload Resolution, userdefined conversion and function template

本文关键字:转换 函数模板 定义 用户 重载 C++      更新时间:2023-10-16

使用g++3.4和4.7时,我观察到以下奇怪的行为:

如果需要用户定义的转换,则函数模板不匹配,而普通函数会匹配。我在C++98标准中找不到相应的规则。g++正确吗?还是一个bug?

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

GCC是正确的,模板参数推导不考虑隐式转换。

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

对于您的代码,auto_ptr_refauto_ptr不匹配,模板参数T的推导失败,因此根本不会考虑函数模板x()来解决过载问题。