標準庫提供了function
模板能夠直接聲明,如std::function<void (int, int)>
。以下函數foo
返回了一個函數指針,該指針接受兩個參數,返回類型爲int。函數
std::function<int (string, int)> foo() { auto handler = [] () { return 0; }; return handler; } int main() { auto func = foo(); cout << func("abc", 1) << endl; return 0; }
要知道,捕獲變量是在執行lambda時纔會賦值。以下是運行報錯的程序,lambda函數捕獲了一個shared_ptr
類型臨時變量tmp
,當foo執行完時,tmp所指向的堆內存塊已經被釋放了,在執行fun()
時就會報錯了,由於tmp不存在。用引用捕獲也是行不通的。這種場景下仍是用回普通指針更合適。指針
class A { public: A() {cout<<"A()"<<endl;}; ~A() {cout<<"~A()"<<endl;}; A(A *a) {cout<<"A(A *a)"<<endl;}; void test(cout<<"123"<<endl;}) }; std::function<void ()> foo() { std::shared_ptr<A> tmp = std::make_shared<A>(new A); auto handler = [tmp] () { // 注意這裏捕獲了tmp tmp->test(); }; return handler; } void main(){ auto fun = foo(); fun(); }