为什么无法将 std::bind 的结果分配给函数指针

Why isn't it possible to assign the result of std::bind to a function pointer

本文关键字:结果 分配 指针 函数 bind std 为什么      更新时间:2023-10-16

std::bind 的结果可以分配给 std::function 可以将函数指针分配给 std::function。

到目前为止,我的印象是 std::function 通常可以容纳任何函数指针。std::函数可以容纳的任何内容都可以分配给函数指针。并发现 std::bind 的结果无法分配给函数指针

int add(int x, int y)
{
   return x+y;
}
int main()
{
   std::function<int (int, int)> fp = &add; // a func pointor can be  assined to an std::function
   int result = fp(3,5) // this works fine
   std::function<int (int, int)> add_v2 = std::bind(&add, _1,_2); // std:: bind can be assigned to an std::function
   int result = add_v2(3,5); // works fine
   int (*add_v3)(int, int);
   add_v3 =  std::bind(&add, _1,_2); // does not compile
}

你能解释一下为什么我不能将 std::bind 的结果分配给函数指针吗

std::function知道如何调用对多种可调用类型的调用,包括普通函数、lambda 和 std::bind() 的结果。 仅仅因为std::function可以处理多个可调用类型并不意味着各个类型可以相互互换/分配。

std::bind() 的返回值返回由实现确定的未指定类型的可调用对象。 该类型具有std::function调用的operator()。绑定对象携带有关目标对象的状态信息以及它需要在其operator()内调用的类方法。因此,根据定义,这样的对象永远无法分配给普通函数指针。没有地方存储状态数据,甚至没有绑定对象自己的this指针。 捕获 lambda 也不能分配给普通函数指针的原因相同。

add_v3 =  std::bind(&add, _1,_2); // does not compile

作为无法正常工作的最明显原因,请考虑执行此行代码后剩下的只是一个裸指针。它能指向什么?

生成的绑定函数(绑定add的结果)_1_2 在这行代码执行之前显然不存在。无论std::bind创建什么,它都是临时的,在此行执行后将不再存在。

那么add_v3,一个简单的原始指针,可能指向什么?什么会拥有它?什么会管理它的寿命?什么时候会被摧毁?