Короче: не делай этого.Нет никакого преимущества в хранении std::reference_wrapper<A>
в вашем списке по сравнению с наличием списка необработанных указателей.
Лучшим подходом было бы сохранить std::shared_ptr
в l, а затем std::weak_ptr
в listRef
,Затем, если вы получите висячие ссылки в listRef
, вы можете проверить, существует ли объект до того, как его использовать:
std::list<std::weak_ptr<A>> listRef;
struct B
{
std::list<std::shared_ptr<A>> l;
B()
{
l.emplace_back(new A(42));
listRef.emplace_back(l.back());
}
void foo()
{
customRemove(l.back());
}
void customRemove(std::shared_ptr< A > obj)
{
l.remove(obj);
obj.reset();
listRef.remove_if([&](const std::weak_ptr<A> & obj2) { return obj2.expired(); });
}
};