可以将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的结果分配给函数指针
答案 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
可能指向什么?什么拥有它?什么将管理其生命?它什么时候被销毁?