It's loose and sloppy language to say "a function returns something". It's OK as a shorthand if you know how to work with that, but in this case you get confused.
The more correct way to think about it is that you evaluate a function call expression. Doing that gives you a value. A value is either an rvalue or an lvalue (modulo details).
When T
is an object type and you evaluate a function that has return type T
, you get a value of type T
which is an rvalue. On the other hand, if the function has return type T &
, you get a value of type T
which is an lvalue (and the value is the thing bound to the reference in the return
statement).
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…