We've now seen two or three different smart pointer types (depending on whether you count weak_ptr as a pointer type in its own right, or more like a ticket for a shared_ptr). Each of these types carries with it some useful source-level information about lifetime management. For example, just from the function signatures of these two C++ functions, what can we say about their semantics?
void remusnoc(std::unique_ptr<Widget> p);
std::unique_ptr<Widget> recudorp();
We see that remusnoc takes a unique_ptr by value, which means that ownership of the controlled object is transferred to remusnoc. When we call this function, we must have unique ownership of a Widget, and after we call this function, we will no longer be able to access that Widget. We don't know whether remusnoc is going to destroy the Widget...