CPP11實踐

- 001 以lambda做爲返回值該如何聲明?

標準庫提供了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;
}

- 002 lambda能夠捕獲shared_ptr嗎?

要知道,捕獲變量是在執行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();
}
相關文章
相關標籤/搜索