[effective modern c++ 學習筆記] Lambda 表示式 徹底拋棄bind
阿新 • • 發佈:2018-11-07
要點總結
<1> lambda基本形式
[捕獲列表](形參表){函式體}
std::find_if(container.begin(), container.end(),[](int val) { return 0 < val && val < 10; })
<2>預設捕獲方式的陷阱
(1)引用方式 捕獲區域性變數引用,在lambda超出該變數有效範圍繼續使用,會引發錯誤。 auto divisor = computeDivisor(calc1, calc2); auto filters = ( [&](int value) { return value % divisor == 0; } ); (2)值傳遞方式 避免對指標的值傳遞,尤其是隱式的this指標
<3>泛型lambda
(1)lambda使用auto形參類似於函式模板 auto f = [](auto x){ return func(normalize(x)); }; class SomeCompilerGeneratedClassName { public: template<typename T> // see Item 3 for auto operator()(T x) const // auto return type { return func(normalize(x)); } // other closure class };
(2)完美轉發
auto f =[](auto&& param)
{
return func(normalize(std::forward<decltype(param)>(param)));
};
<3>完全使用lambda替代bind
一句話,在c++14中,應完全放棄bind的使用,無論是易讀行,效率都沒有使用bind的理由。