I'll recommend using as much references as possible as they can't be null, memory can't get deleted accidentally. I find "obj.someFunc()" easier to read than "obj->someFunc()". std::reference_wrapper is indeed nice and may add some additional semantic to your code, it's explicit way of saying that you keep a reference, not a raw owning pointer.