要点总结
<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的理由。