Что такое замыкание в С++

Помогите понять разницу между обычной лямбдой и замыканием (я вычитал что лямбды не всегда являются замыканиями).

Меня интересует ряд вопросов:

  1. Где-то пишут что замыкание это именно захват по ссылке, а где-то что замыкание это когда мы захватываем что-то и не важно как:

...

//1. Это замыкание?
[&](int a) { ... };

//2. если да, можно ли сказать что замыкание это когда мы захватывает все внешние объекты или это
//   тоже можно считать замыканием
[&var1](int a) { ... };

//3. И тоже самое с захватом значения. Это замыкание?
[=](int a) { ... };

//4. А это?
[var1](int a) { ... };

//4. А если добавить mutable?
[=](int a) mutable { ... };
[var1](int a) mutable { ... };

  1. Если все вышеперечисленное является замыканием, является ли замыканием когда мы ничего не захватываем

[](int a) { ... };

  1. Если пункт 2 это тоже замыкание, что тогда не является замыканием?

Что вообще считать замыканием? Кто-то пишет что это когда мы вызываем нашу лямбду.


Ответы (1 шт):

Автор решения: KoVadim

Данный вопрос хорошо разобран в книге Майерса Эффективный и современный с++ (2016). А именно это глава 6, 221 страница внизу.

Замыкания (closure) представляет собой объект времени выполнения, создаваемый лямбда выражением. В зависимости от режима захвата замыкания хранят копии ссылок на захваченные объекты.

Лямбда выражение - это код, то есть то, что написал программист буковками.

то есть, все, что написано в вопросе - это лямбды. Но когда этот код выполняется и создается объект (у которого лямда по факту является operator(), а захваченные переменные - переменными этого класса), появляется "Замыкание".

→ Ссылка