если я правильно понял, что ты хочешь сделать, то надо было передавать Rc не по ссылке, а по значению. Ссылка не инкрементирует счётчик, а копирование shared_ptr инкрементирует
std::function<int(void)> f(std::shared_ptr<int> x) {
return [&]() { return *x; };
}
как-то так. В функцию передаём шаред по ссылке, потому что нет смысла копировать, он почти сразу умёр, а вот захват в лямбду обязательно по значению, ведь ей потребуется эта память
std::function<int(void)> f(const std::shared_ptr<int>& x) {
return [=]() { return *x; };
}