首页  >  文章  >  后端开发  >  为什么“std::function”的模板参数会导致重载解析中的歧义?

为什么“std::function”的模板参数会导致重载解析中的歧义?

Barbara Streisand
Barbara Streisand原创
2024-11-06 03:45:02735浏览

Why Does `std::function`'s Template Argument Lead to Ambiguity in Overload Resolution?

尽管定义了类型,Std::Function 的模板参数中仍存在歧义

在这种情况下,函数“a”存在多个重载,每个重载接受 std::function:

  • function
  • function

的不同签名由于两个 function 都存在,因此产生了歧义。和函数可以由相同的函数构造。 VS2010 中定义的 std::function 构造函数允许从不同来源进行构造:

template<class _Fx>
function(_Fx _Func, typename _Not_integral<!...int>::_Type = 0);

本质上,任何对象都可以转换为 std::function,从而促进类型擦除并能够处理任意对象作为函数。

为了进一步说明问题,请考虑以下简化示例:

template<class Signature>
class myfunc{
   public:
      template<class Func>
      myfunc(Func a_func){
          // ...
      }
};

在 'a' 的重载解析期间,如果无法识别可行的重载,编译器将尝试使用参数的构造函数或参数的转换运算符来转换参数。在这种情况下,转换是通过 myfunc 的构造函数进行的。

由于 myfunc 的构造函数接受任何内容,因此两个 function 都可以接受任何内容。和函数可以转换为 myfunc

最终,这会导致编译器无法确定要调用 'a' 的哪个重载,从而导致歧义。

To解决这个问题,你有几个选择:

  1. 维护显式转换:
    显式转换可以为编译器指定所需的重载:a((functionx))
  2. 函数对象:
    创建适当类型的函数对象: `function; fx = x;
    函数; fy = y;`
  3. 模板元编程:
    使用模板元编程来获取正确的签名:`template
    struct get_signature{...};`

以上是为什么“std::function”的模板参数会导致重载解析中的歧义?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn