Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>С передачей переменных (собственно — замыканием) дело обстоит точно так же, как и с передачей фактических параметров в функции, возвратом значений, формированием объектов и т.п. То есть можно, например, создать объект, один из членов которого будет ссылаться на локальную переменную:
ГВ>ГВ>
ГВ>Но если так сделать, то ты сам себе недобрый Буратин. Аналогичное ограничение с лямбдами.
Об этом и говорю.
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++) нужно контролировать, что именно происходит с твоими переменными.
Т.е. если захотелось передать лямбду с замыканием наружу — то как надо поступить?