Am I correct in what I say is typical here?
Function parameters of non-scalar types such as structs typically have reference types. This is because usually the function wants to borrow their values rather than take ownership. If the caller uses a variable to pass a non-scalar value and the function takes ownership, the caller loses ownership and can no longer use the variable unless the function returns it.
Function return values of non-scalar types such as structs typically have non-reference types. This is because usually the function creates the value and wants to transfer ownership to the caller.If a function creates a non-scalar value and returns a reference to it, the code will not compile because the value goes out of scope and is dropped.