Лямбда захвачена ссылкой и используется в слоте - PullRequest
5 голосов
/ 16 мая 2019

У меня есть код C ++ 14, подобный этому:

void C::f() {
  int& ref = this->x;
  auto lb = [&ref]() {
    /* do stuff with "ref" */
  };
  if (foobar) {
    // call lb when signal fires. 
    connect(object, &D::signal, [&lb]() {
      lb();
    });
  } else {
    lb();
  }
}

Я знаю, что к тому времени, когда я использую lb, this все еще будет действовать. А как же ref и lb. Есть ли какая-нибудь свисающая ссылка с кодом выше?

Я нашел похожие вопросы ( здесь , там , ...), но я не мог сделать вывод.

1 Ответ

7 голосов
/ 16 мая 2019

lb имеет автоматическое сохранение, поэтому ссылки на него становятся недействительными, когда эта функция возвращается.

Срок действия ref зависит от срока службы *this.
(Лямбда не захватывает переменную ref по ссылке, она захватывает ссылку на объект, на который ссылается ref.)

...