Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.235.139.122] |
|
Сообщ.
#1
,
|
|
|
В статье наткнулся на такой абзац:
Цитата Что-то я никак не могу представить себе такую ситуацию, когда захваченная переменная выходит из области видимости, а лямбда остается. Ведь на момент создания лямбды захватываемая переменная должна существовать, а значит лямбда выйдет из области видимости не позднее, чем захваченная переменная.The lambda could also modify the outer variable through that reference, say like this: auto lambda_func = [&int_var] () {cout << "This lambda is modifying int_var by adding 5" << endl; int_var += 5;}; This will change the outer scope int_var by adding 5 every time we call this lambda object. ... A gotcha. Be careful with reference captures. A captured reference is only valid if the referred-to variable still exists, so if you have a lambda with a reference capture that ends up getting used after the original variable goes out of scope, the results are undefined. На cpprefernce тоже упоминаются "висячие" ссылки. Единственное, что я смог придумать - это если лямбда возвращает другую лямбду и эта другая захватывает переменную из первой лямбды. Это оно? |
Сообщ.
#2
,
|
|
|
Можно сохранить ссылку на лямбду и вернуться.
Или вернуть ссылку на лямбду. Не обязательно из другой лямбды. Можно и из функции. Если захват контекста происходит по значениям, то всё должно быть в порядке, а вот ссылки станут невалидными. |
Сообщ.
#3
,
|
|
|
Цитата Dushevny @ то-то я никак не могу представить себе такую ситуацию, когда захваченная переменная выходит из области видимости, а лямбда остается Лямбду можно обернуть в std::function и передать наружу, так что она запросто может пережить свою область видимости. |
Сообщ.
#4
,
|
|
|
Цитата amk @ Это как? Ссылка же будет в той же области видимости.Цитата Pacific @ Это я не учел, с std::function не работал. Лямбду можно обернуть в std::function |
Сообщ.
#5
,
|
|
|
Цитата Dushevny @ Лямбду можно обернуть в std::function Это я не учел, с std::function не работал. Ещё std::thread не забудь, туда тоже лямбду можно передавать. |