Вылетит ли лямбда из области видимости, если вернется - PullRequest
0 голосов
/ 17 января 2019

У меня есть структура, которая принимает функцию или вызываемый объект в качестве ввода:

struct House {
  std::function<int()> colorSelector;
}

Теперь я назначаю таким образом:

House getHouse() {
  House h;
  int color = 10;
  h.colorSelector = [&]() {
    return color;
  }
  return h;
}

Буду ли я сталкиваться с проблемой определения объема?Как после возвращения getHouse, цвет (локальная переменная) будет уничтожен?

1 Ответ

0 голосов
/ 17 января 2019

Буду ли я сталкиваться с проблемой определения объема?

Да.

Ваша лямбда захватывает color по ссылке, и после возврата getHouse стек раскручивается, и дальнейший доступ к color является неопределенным поведением.

Вы должны захватить color по значению, чтобы избежать такой проблемы.

h.colorSelector = [color]() {
  return color;
}

Если вам нужно сослаться на тот же color, возможно, вы хотите разместить где-нибудь std::shared_ptr<color> и вместо этого получить его копию.

...