使用lambda表达式时,要显示地指明捕获列表。
lambda表达式可以捕获静态变量,并且指涉到的是那个静态变量的全局唯一存储位置。

初始化捕获

  1. class Widget {
  2. public:
  3. bool isValide();
  4. private:
  5. };
  6. int main()
  7. {
  8. auto pw = make_unique<Widget>();
  9. // do some work with *pw
  10. auto f = [pw = move(pw)](){
  11. return pw->isValide();
  12. };
  13. return 0;
  14. }

在lambda表达式的捕获列表中可以使用pw = move(pw)进行初始化捕获。这里等号左右的pw 作用域不同。左侧pw 的作用域位于lambda表达式的闭包内,而右侧pw 的作用域则与lambda表达式定义处相同(main函数)。
默认的捕获只有复制和引用2种,c++14中支持的初始化捕获式允许了任意形式的捕获(这里是将对象移入lambda的闭包)。

匿名函数形式的完美转发

  1. auto f = [](auto&& x) {
  2. func(forward<decltype(x)>(x));
  3. };

decltype可以推断出x是左值还是右值。

选择lambda替代std::bind,因为其可读性和效率都比较高