Weak pointers

When all pointers and references to an object go out of scope, the object gets automatically destroyed. An ordinary pointer can be converted to a weak pointer. When all ordinary pointers and and references go out of scope, the object gets destroyed even if there's a weak pointer to the object:

#include <x/obj.H>
#include <x/ref.H>
#include <x/weakptr.H>

class widgetObj : virtual public x::obj {

// ...


typedef x::ref<widgetObj> widget;

typedef x::ptr<widgetObj> widgetptr;

typedef x::weakptr<widgetptr> weakwidget;

// ...

widget w{widget::create()};

// ...

weakwidget weakw=w.weaken();

// ...

widgetptr origw=weakw.getptr();

if (!origw.null())
    // ...

weaken() creates a weakptr, a weak pointer. Alternatively, its constructor can be invoked directly, but note that the template's constructor takes a x::ptr and not an x::ref, but both x::ptrs and x::refs have a weaken() method. The only method implemented by a weakptr is getptr(), which returns an ordinary, strong pointer to the underlying object, if it still exists. If all other existing references to the object previously went out of scope and the object got destroyed, getptr() returns an unbound reference.

Like x::ptr, the implementation of weakptr is thread-safe, however see important comments about thread safety of references.