На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
  
> Лямбда, захват по ссылке и выход захваченного из области видимости. , не пойму, как такое может произойти.
    В статье наткнулся на такой абзац:
    Цитата
    The lambda could also modify the outer variable through that reference, say like this:
    ExpandedWrap disabled
      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 тоже упоминаются "висячие" ссылки.

    Единственное, что я смог придумать - это если лямбда возвращает другую лямбду и эта другая захватывает переменную из первой лямбды. Это оно?
      Можно сохранить ссылку на лямбду и вернуться.
      Или вернуть ссылку на лямбду. Не обязательно из другой лямбды. Можно и из функции. Если захват контекста происходит по значениям, то всё должно быть в порядке, а вот ссылки станут невалидными.
        Цитата Dushevny @
        то-то я никак не могу представить себе такую ситуацию, когда захваченная переменная выходит из области видимости, а лямбда остается

        Лямбду можно обернуть в std::function и передать наружу, так что она запросто может пережить свою область видимости.
          Цитата amk @
          Это как? Ссылка же будет в той же области видимости.
          Цитата Pacific @
          Лямбду можно обернуть в std::function
          Это я не учел, с std::function не работал.
            Цитата Dushevny @
            Лямбду можно обернуть в std::function
            Это я не учел, с std::function не работал.


            Ещё std::thread не забудь, туда тоже лямбду можно передавать.
            0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
            0 пользователей:


            Рейтинг@Mail.ru
            [ Script execution time: 0,0295 ]   [ 17 queries used ]   [ Generated: 19.03.24, 11:51 GMT ]