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

时间:2018-12-22 01:54:37

标签: c++

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

到目前为止,我的印象是std :: function通常可以容纳任何函数指针。 std :: function可以保存的任何内容都可以分配给函数指针。 并发现无法将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的结果分配给函数指针

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

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

这是最无法解决的最明显原因,请考虑执行此行代码后剩下的就是一个裸指针。它可以指向什么?

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

一个简单的原始指针add_v3可能指向什么?什么拥有它?什么将管理其生命?它什么时候被销毁?