C ++ 11 лямбда-выражение захватывает this и записывает локальные переменные по значению - PullRequest
0 голосов
/ 05 мая 2018

Лямбда-функция ниже захватывает 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;
        // ...
     };
  }
};

Но если я хочу перехватить множество переменных экземпляра и избежать явного именования их в списке захвата, я не , похоже, смогу сделать это:

     _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 голосов
/ 05 мая 2018

[=] делает то, что вы хотите - он захватывает все, что не является переменной-членом по значению, и *this по ссылке (или this по значению).

[*this,=] захватывает обе локальные переменные и объект по значению в .

[&] захватывает локальные переменные по ссылке и *this по ссылке или this (указатель) по значению.

Оба режима захвата по умолчанию захватывают this одинаково. Только в вы можете изменить это.

0 голосов
/ 05 мая 2018

[=] будет работать, потому что он копирует все автоматические переменные, используемые в теле лямбды, копией.

Вот пример вывода: https://www.ideone.com/kkXvJT

#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();
}
0 голосов
/ 05 мая 2018

[=] уже захватывает this по значению. Посмотрите на следующий код здесь: http://cpp.sh/87iw6

#include <iostream>
#include <string>

struct A {
    std::string text;

    auto printer() {
        return [=]() {
            std::cout << this->text << "\n";
        };
    }
};

int main() {
    A a;
    auto printer = a.printer();
    a.text = "Hello, world!";

    printer();
}
0 голосов
/ 05 мая 2018

Как говорит cppreference:

[=] захватывает все автоматические переменные, используемые в теле лямбды, копией и текущий объект по ссылке, если существует

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...