标准库提供了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(); }