C ++ 11 lambda捕获`this`并按值

时间:2018-05-04 21:39:06

标签: c++ c++11 lambda

下面的lambda函数捕获this(因此bar()可以访问其实例变量)和局部变量a,b,c

class Foo {
  int x, y, z;
  std::function<void(void)> _func;
  // ...
  void bar() {
     int a,b,c;
     // ...
     _func = [this,a,b,c]() { // lambda func
        int u = this->x + a;
        // ...
     };
  }
};

但是如果我想捕获许多实例变量并希望避免在捕获列表中明确命名它们,那么 not 似乎能够做到这一点:

     _func = [this,=]() { // lambda func
        // ...
     };

我在=后面的this,收到编译错误:

  error: expected variable name or 'this' in lambda capture list 

如果我试试这个

     _func = [=,this]() { // lambda func
        // ...
     };

我得到了

  error: 'this' cannot be explicitly captured when the capture default is '='

是否有通过值捕获this和其他所有内容的简写?

4 个答案:

答案 0 :(得分:6)

正如cppreference所说:

  

[=]通过复制和当前对象(如果存在)捕获lambda体中使用的所有自动变量

答案 1 :(得分:3)

#include <iostream> #include <functional> class Foo { int x, y, z; std::function<void(void)> _func; public: Foo(int a): x(a), y(0), z(0) {} void bar() { int a = 1,b,c; _func = [=]() { int u = this->x + a; std::cout << u << std::endl; }; _func(); // lambda call } }; int main() { Foo obj(1); obj.bar(); } 已按值捕获[=]。请在此处查看以下代码:http://cpp.sh/87iw6

this

答案 2 :(得分:3)

[=]执行您想要的操作 - 它会按值捕获任何不是成员变量的内容,并通过引用捕获*this(或按值this捕获。

[*this,=]中按值捕获对象的局部变量。

[&]通过引用捕获局部变量,通过引用捕获*this或通过值捕获this(指针)。

两种默认捕获模式都以相同的方式捕获this。只有才能改变它。

答案 3 :(得分:1)

it('should change the language when selected from the language drop-down', () => { var languages = [ {name: 'Bulgarian', login: 'XXX', about: 'XXX'}, {name: 'Czech', login: 'Prihlaseni', about: 'O'} ]; languages.forEach((language, i) => { loginPage.clickLanguageDropdown(); loginPage.element(by.css('.vm-language-choices > li:nth-child(' + (i + 1) + ')').click(); expect(loginPage.loginButton.getText()).toEqual(languages[i].login); expect(loginPage.aboutHeader.getText()).toEqual(languages[i].about); }); }); 将起作用,因为它通过复制捕获lambda体中使用的所有自动变量。

以下是示例输出:https://www.ideone.com/kkXvJT

[=]