Замыкания неотделимы от лямбд. Они позволяют передавать в лямбду ссылки. Например в лямбде вам потребовалось менять приватную переменную класса. Без замыкания вам пришлось бы делать сеттер и геттер (что уже меняет интерфейс класса, их можно будет вызвать там, где не стоило бы), передавать в лямбду указатель на объект.
А так вы работаете с переменной объекта внутри лямбды, как будто это локальная переменная лямбды.
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
using IntV = vector<int>;
int main(int argc, char const *argv[]) {
IntV v = {0, 9, 4, 6, 7, 8, 5, 6};
size_t count = 0;
for_each(begin(v), end(v), [](IntV::value_type x){cout << x << " ";});
cout << endl;
sort(begin(v), end(v), [&count /*closure*/](IntV::value_type &a, IntV::value_type &b){
++count;
return a < b;
});
cout << count << endl;
for_each(begin(v), end(v), [](IntV::value_type x){cout << x << " ";});
cout << endl;
return 0;
}
Вот пример вам подсчёта количества сравнений при сортировке вектора.