C过载分辨率,用户定义的转换和功能模板

前端之家收集整理的这篇文章主要介绍了C过载分辨率,用户定义的转换和功能模板前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
使用g 3.4和4.7,我观察到以下奇怪的行为:

如果需要用户定义的转换,则函数模板不匹配,其中普通函数将是.
我在C 98标准中找不到相应的规则.是正确的,(我假设)?或者这是一个错误

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是正确的,template argument deduction不考虑隐式转换.

Type deduction does not consider implicit conversions (other than type adjustments listed above): that’s the job for overload resolution,which happens later.

对于你的代码,auto_ptr_ref与auto_ptr不匹配,模板参数T的推导失败,因此函数模板x()根本不会被考虑用于重载解析.

猜你在找的C&C++相关文章