First when you write
throw Exception();
what is being thrown is not really a temporary object created by the prvalue Exception() expression. Conceptually, there is a separate object - an exception object - that is initialized from this temporary object, and this is actually an exception object. (Compilers are allowed to delete copy / move.)
Secondly, language rules say that an exception object is always considered an lvalue. Therefore, it is allowed to bind to non-constant lvalue references.
TC
source share