本篇笔记包含 Term 31~34。

Term 31:避免默认捕获模式

默认捕获模式可能造成一些语义模糊,让我们误以为变量都是按值捕获,可以安全使用,实际上只有非静态局部变量才会按值捕获。当可能造成指针空悬时,我们应当明确把该变量复制到闭包。

Term 32:使用初始化捕获将对象移入闭包

C++14 中添加了广义捕获的特性,可以实现移动语义的捕获甚至是直接初始化一个对象放入闭包。在 C++11 则需要使用 std::bind 来模拟达成类似的效果。

auto func = [_pw = std::move(pw)] {}  // pw 是一个 unique_ptr,_pw是闭包捕获的形参名
auto func = [pw = std::make_unique<Foo>()] {} // 这种广义”捕获“也是支持的

Term 33:对 auto&& 型别的形参使用 decltype,以 std::forward 之

auto f = [](auto&&... params) {
  return func(std::forward<decltype(params)>(params)...); 
};

Term 34:优先选用 lambda 式,而非 std::bind

对于 modern C++ 而言,使用 lambda 式在任何时候都是更优选,std::bind 唯一的作用式在 C++11(非 C++14) 中实现移动捕获和绑定模板化的函数调用运算符。