template<typename T> class Xref { public: Xref(int i, T* p) // store a pointer: Xref is the owner :index{i}, elem{p}, owner{true} {} Xref(int i, T& r) // store a pointer to r, owned by someone else :index{i}, elem{&r}, owner{false} {} Xref(int i, T&& r) // move r into Xref, Xref is the owner :index{i}, elem{new T{move(r)}}, owner{true} {} ~Xref() { if(owned) delete elem; } //... private: int index; T* elem; bool owned; }; ...