В общем случае не так. Никто не мешает взять ссылку от объекта или захватить лямбдой, положить её в контейнер, а объект тем временем уничтожиться
Тут вопрос в другом - в какой момент будет ошибка. Если считать, что ошибка в том, что ты так захватил быстроживущий объект по ссылке в долгоживущий, то shared pointer тут не выход, а костыль. Ты как бы вместо того чтоб продумать норм структуру владения маскируешь ошибку продлевая жизнь объекту.
Потому что ссылка прямо говорит, что объект другим не владеет. А shared pointer врёт. По факту объект владеет, но на самом деле не должен, просто "чтоб не падало" так сделали