Re[35]: Работа - с чего начать: С++ или С#?
От: samius Япония http://sams-tricks.blogspot.com
Дата: 05.05.09 22:33
Оценка: +1
Здравствуйте, Геннадий Васильев, Вы писали:

ГВ>С передачей переменных (собственно — замыканием) дело обстоит точно так же, как и с передачей фактических параметров в функции, возвратом значений, формированием объектов и т.п. То есть можно, например, создать объект, один из членов которого будет ссылаться на локальную переменную:


ГВ>
ГВ>


ГВ>Но если так сделать, то ты сам себе недобрый Буратин. Аналогичное ограничение с лямбдами.

Об этом и говорю.

S>>Т.е. лямбду можно передать аргументом, но вернуть в качестве результата ни лямбду, ни что-то ее использующее нельзя.


ГВ>Возвращать лямбду как функцию, судя по всему, тоже можно. Вот фрагменты из примеров, которые приведены по той ссылке, что я давал:


ГВ>
ГВ>function<void (int)> g = [](int n) { cout << n * n * n << " "; };
ГВ>

Нет замыкания...

ГВ>
ГВ>vector<int> a;
ГВ>vector<int> b;

ГВ>// ...

ГВ>auto prime = [](const int n) -> bool {
ГВ>    if (n < 2) {
ГВ>       return false;
ГВ>    }

ГВ>    for (int i = 2; i <= n / i; ++i) {
ГВ>        if (n % i == 0) {
ГВ>            return false;
ГВ>        }
ГВ>    }
ГВ>    return true;
ГВ>};

ГВ>keep_if(a, prime);
ГВ>keep_if(b, prime);
ГВ>

И тут нет замыкания

S>>Как можно говорить о классическом замыкании то что работает как замыкание только в одну сторону?


ГВ>ИМХО, можно. Просто вопросы согласования жизненных циклов, как обычно, лежат на программисте. Само по себе замыкание от этого неполноценным не становится, но (как это всегда бывает на C++) нужно контролировать, что именно происходит с твоими переменными.

Т.е. если захотелось передать лямбду с замыканием наружу — то как надо поступить?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.