有什么不同吗?
“保存/转移”功能的最佳方法是什么?
function<void(int)> fcn =
[](int par) {std::cout<<"fcn: "<<par<<std::endl; };
void(*fcn_a)(int) =
[](int par) {std::cout<<"fcn_a: "<<par<<std::endl; };
fcn(12);
fcn_a(12);
答案 0 :(得分:6)
std::function
更通用 - 您可以在其中存储任何具有正确签名的可调用对象(函数指针,方法指针,带operator()
的对象),并且可以使用{{std::function
构造{{1}} 3}}
函数指针只能接受具有正确签名的函数,但可能稍微快一点,并且可能会生成稍微小一点的代码。
答案 1 :(得分:5)
在非捕获lambda的情况下,使用函数指针比使用std::function
更快。这是因为std::function
是一种更为通用的野兽,并使用类型擦除来存储传递给它的函数对象。它通过类型擦除实现了这一点,这意味着你最终会调用operator()
是虚拟的。
OTOH,非捕获lambdas可隐式转换为相应的函数指针。但是,如果您需要一个完整的闭包,则必须尽可能将lambda指定给std::function
,或者通过模板依赖于类型推导。