, id(tt.id)
, pointed_to_object_is_alive(false)
{
- if (tt.pointed_to_object_is_alive && t != nullptr)
- t->subscribe(&pointed_to_object_is_alive, id);
+ if (tt != nullptr)
+ {
+ Assert(tt.pointed_to_object_is_alive,
+ ExcMessage("You can't move a smart pointer object that "
+ "is pointing to an object that is no longer alive."));
+
+ t->subscribe(&pointed_to_object_is_alive, id);
- // Release the rhs object as if we had moved all members away from
- // it directly:
- tt = nullptr;
+ // Release the rhs object as if we had moved all members away from
+ // it directly:
+ tt = nullptr;
+ }
}
inline SmartPointer<T, P> &
SmartPointer<T, P>::operator=(SmartPointer<T, P> &&tt) noexcept
{
+ if (tt == nullptr)
+ {
+ *this = nullptr;
+ }
// if objects on the left and right hand side of the operator= are
// the same, then this is a no-op
- if (&tt != this)
+ else if (&tt != this)
{
// Let us unsubscribe from the current object
- if (pointed_to_object_is_alive && t != nullptr)
+ if (pointed_to_object_is_alive)
t->unsubscribe(&pointed_to_object_is_alive, id);
- // Then reset to the new object, and subscribe to it, assuming
- // that the the rhs points to anything in the first place:
- if (tt.pointed_to_object_is_alive && tt != nullptr)
- {
- t = tt.get();
- t->subscribe(&pointed_to_object_is_alive, id);
- }
- else
- t = nullptr;
+ // Then reset to the new object, and subscribe to it:
+ Assert(tt.pointed_to_object_is_alive,
+ ExcMessage("You can't move a smart pointer object that "
+ "is pointing to an object that is no longer alive."));
+ t = tt.get();
+ t->subscribe(&pointed_to_object_is_alive, id);
// Finally release the rhs object since we moved its contents
tt = nullptr;