C++11 lambda使用技巧小結
阿新 • • 發佈:2019-02-17
在lambda中 一般的引數捕獲有
1.[=]值傳遞
2.[&]引用傳遞
官方文件寫傳值只能讀不能寫,但傳引用的話可以讀和寫。
如果增加mutable宣告, 則可以修改值傳遞的物件。
例1
j = 10;
auto by_val_1 = [j]()mutable{ j++; cout << "lambda j: " << j << endl; };
by_val_1();
cout << "j: " << j << endl;
結果
lambda j: 11
j: 10
但是 對於外部的變數j並沒有任何改動
因而得知 值傳遞帶mutable宣告雖然可以改變lambda中的物件, 但不會對外部變數產生影響
例2
以上的程式碼無法通過編譯class Obj { public: void TestFunc() { cout << "TestFunc" << endl; } }; Obj obj1; auto by_ref_func = [&]() { cout << "by ref lam" << obj1.m_n1 << endl; obj1.TestFunc(); }; by_ref_func(); auto by_va_func = [=]() { cout << "by val lam" << obj1.m_n1 << endl; obj1.TestFunc(); };
在lambda內呼叫物件的普通函式 可以使用引用傳遞
但普通的值傳遞不能 有兩種辦法解決
1 增加mutable宣告
auto by_val_lambda_func = [=]()mutable
{
cout << "by val lam" << obj1.m_n1 << endl;
obj1.TestFunc();
};
2 目標呼叫函式宣告為constclass Obj { public: void TestFunc() const { cout << "TestFunc" << endl; } };