I feel like it's worth imagining what may be happening under the covers (in assembler/machine language) to help understand this behavior.
Parameters (either values or addresses of values) are passed into a function on the stack.
While a function is operating, local variables are pushed onto the stack, and operations involving those variables are done using an address that is relative to a register which got a copy of the value of (address pointed at by) the stack pointer as of the time when our function was called.
When a function exits, it "unwinds the stack," by moving the stack pointer back to the position that it was in before the parameters were pushed onto the stack, and then the return value(s) are pushed onto the stack.
So when we call a function, our locals are on the stack, and our parameters get pushed onto it after them. When the function returns, the return value is on the stack in place of our parameters right after our locals.
If we assign that return value to a local, the compiler may choose to do a bit of "return value optimization" in the form of "copy elision" by simply associating that stack location with that local.
This "copy elision" may be sort of "forced" or at least "requested" in the case where the return value is being assigned to a "const reference". But it's still a reference to a stack location - so when the function in which the function call was made returns... the stack is unwound and all the locals are lost including that return value.
In light of this.. intuitively imagined understanding of what's happening, it seems like C++ should allow local non-const references to be assigned to return values, but it should not allow non-local references (const or otherwise) to be assigned to return values, because assigning a non-local reference implies that the memory associated with that reference is somehow being preserved outside of the local scope without copying it, which, in the case of a return value stored on the stack, is rather impractical.