It's possible (and common) to transfer ownership of a value to a different scope. For example, we can do something like this:
{
let main_1 = Point2D {x: 10.0, y: 10.0};
receive_ownership(main_1);
receive_ownership(main_1); // This will cause a compiler error!
}
What is happening is that the main_1 variable is created and initialized under the ownership of the current scope (the value is pushed onto the stack), but then the ownership is transferred to the scope of the block expression that makes up the receive_ownership function's body, when the value is used as a function parameter. The compiler knows that the current scope is no longer responsible for cleaning up the value stored in main_1, because that job now belongs to a different scope.
The bytes that represent the value on the stack are copied to a new location on the stack, within...