Оба кода имеют неопределенное поведение, все возможно.
Причина одинакова для двух случаев: переменная size
является локальным объектом внутри operator()
лямбды, она будет быть уничтоженным, когда вызов заканчивается. Вы захватываете size
по ссылке, а ссылка привязана.
Изменение в режим захвата по значению было бы хорошо. например,
return [=] (bool b) {
cout << "v.size() : " << v.size() << "\n"; // print 1
cout << "size inside : " << size << "\n"; // print 1
};