为什么超载解析无法确定要重载函数的哪个版本来初始化std :: function对象?

问题描述 投票:0回答:1

我有关于std::function的示例:

int add(int x, int y, int z) {return x + y + z;}
int add(int a, int b) {return a + b;}

int main()
{
    std::function<int(int, int)> fn = add; // error

    int(*pfn)(int, int) = add; // OK
    fn = pfn; // ok  fn is bound to add(int, int)
    std::cout << fn(5, 7) << std::endl; // 12

}
  • 为什么初始化add时过载解析不能解析哪个版本的fn,但是能够初始化功能指针pfn

  • 是否有替代方法,而不是使用函数指针来确定重载函数的哪个版本作为std::function对象的初始化程序?

c++ function function-pointers overload-resolution
1个回答
1
投票

为什么初始化fn时过载解析不能解析哪个版本的add,但是能够初始化函数指针pfn?

因为基于函数指针的类型,overload resolution是在函数指针的初始化(如pfn)中执行的。

在所有这些上下文中,从重载集中选择的函数是其类型与目标期望的指向函数的指针,指向函数的引用或指向成员函数类型的指针匹配的函数:正在初始化的对象或引用,左侧-赋值,函数或运算符的手侧,函数的返回类型,强制类型转换的目标类型或模板参数的类型。

作为解决方法,您可以应用static_cast来明确指定要重载。例如

std::function<int(int, int)> fn = static_cast<int(*)(int, int>(add);
© www.soinside.com 2019 - 2024. All rights reserved.