为什么无法将 std::bind 的结果分配给函数指针
Why isn't it possible to assign the result of std::bind to a function pointer
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
,一个简单的原始指针,可能指向什么?什么会拥有它?什么会管理它的寿命?什么时候会被摧毁?
相关文章:
- 如何通过查找迭代器结果分配给一组对的元素
- 分配给浮点数的积分文字除法 - 为什么结果是错误的?
- 分段错误分配函数结果
- 使用动态分配的数组进行矩阵乘法;结果不正确
- 具有预分配结果C++的重载加运算符
- 贪婪地分配分数以最大化最终结果
- Valarray 就地操作作为临时分配给出不同的结果
- 为什么在C 中不确定,为签名类型的对象分配范围的值的结果
- 左col结果分配给相同的矩阵会导致分割故障
- 是否可以为 #define 分配定义的结果?
- 将稀疏 mat-vec-mult 的结果存储到预分配的向量中
- 如何在 c++ 中将 std:fixed << setprecision(5) 的结果分配给变量
- 只有当声明一个对象时,内存空间才会分配给类的数据成员,那么为什么 Sizeof(class_name) 给我结果
- 为什么无法将 std::bind 的结果分配给函数指针
- 将函数结果分配给变量的问题
- 返回新对象的函数与将函数的结果分配给调用它的对象的 C++ 区别
- 将更改此静态变量内部的函数的结果分配给静态变量
- 对结构进行操作并将结果分配给同一结构是否是一种不好的做法?为什么
- 是否有可能将一个动作附加到boost::spirit::规则解析器,该解析器将解析结果分配给(尚未)未知实例的成员
- C++:将按位 AND 的结果分配给布尔值