Что такое замыкание в С++
Помогите понять разницу между обычной лямбдой и замыканием (я вычитал что лямбды не всегда являются замыканиями).
Меня интересует ряд вопросов:
- Где-то пишут что замыкание это именно захват по ссылке, а где-то что замыкание это когда мы захватываем что-то и не важно как:
...
//1. Это замыкание?
[&](int a) { ... };
//2. если да, можно ли сказать что замыкание это когда мы захватывает все внешние объекты или это
// тоже можно считать замыканием
[&var1](int a) { ... };
//3. И тоже самое с захватом значения. Это замыкание?
[=](int a) { ... };
//4. А это?
[var1](int a) { ... };
//4. А если добавить mutable?
[=](int a) mutable { ... };
[var1](int a) mutable { ... };
- Если все вышеперечисленное является замыканием, является ли замыканием когда мы ничего не захватываем
[](int a) { ... };
- Если пункт 2 это тоже замыкание, что тогда не является замыканием?
Что вообще считать замыканием? Кто-то пишет что это когда мы вызываем нашу лямбду.
Ответы (1 шт):
Данный вопрос хорошо разобран в книге Майерса Эффективный и современный с++ (2016). А именно это глава 6, 221 страница внизу.
Замыкания (closure) представляет собой объект времени выполнения, создаваемый лямбда выражением. В зависимости от режима захвата замыкания хранят копии ссылок на захваченные объекты.
Лямбда выражение - это код, то есть то, что написал программист буковками.
то есть, все, что написано в вопросе - это лямбды. Но когда этот код выполняется и создается объект (у которого лямда по факту является operator(), а захваченные переменные - переменными этого класса), появляется "Замыкание".