C++ 函数与函数指针

C++ 函数与函数指针,c++,function-pointers,std-function,C++,Function Pointers,Std Function,有什么不同吗 “保存/传输”功能的最佳方式是什么 function<void(int)> fcn = [](int par) {std::cout<<"fcn: "<<par<<std::endl; }; void(*fcn_a)(int) = [](int par) {std::cout<<"fcn_a: "<<par<<std

有什么不同吗

  • “保存/传输”功能的最佳方式是什么

    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);
    
    函数fcn=
    
    [](int par){std::cout
    std::function
    更通用-您可以在其中存储任何具有正确签名的可调用对象(函数指针、方法指针、带有
    运算符()的对象
    ),并且您可以使用构造
    std::function


    函数指针只能接受具有正确签名的函数,但可能稍快一些,并且可能生成稍小一些的代码。

    在未捕获lambda的情况下,使用函数指针将比使用
    std::Function
    快。这是因为
    std::Function
    是一种更通用的beast,并且使用类型e-erasure来存储传递给它的函数对象。它通过类型擦除来实现这一点,这意味着您最终将调用
    操作符()
    成为虚拟的

    OTOH,非捕获lambda可隐式转换为相应的函数指针。但是,如果需要完整的闭包,则必须尽可能将lambda分配给
    std::function
    ,或者依赖于通过模板进行的类型推断