1. 程式人生 > >[effective modern c++ 學習筆記] Lambda 表示式 徹底拋棄bind

[effective modern c++ 學習筆記] Lambda 表示式 徹底拋棄bind

要點總結

<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的理由。