C ++ 11: ¿Por qué se permite asignar valores?

De lo que entiendo, la razón por la cual es peligroso devolver referencias de valores a las funciones se debe al siguiente código:

T&& f(T&& x) { do_something_to_T(x); return static_cast<T&&>(x); }
T f(const T& x) { T x2 = x; do_something_to_T(x2); return x2; }
T&& y = f(T());

Esto dejay como una referencia pendiente indefinida.

Sin embargo, no entiendo por qué el código anterior incluso se compila. ¿Existe alguna razón legítima para asignar una referencia de valor a otra referencia de valor? ¿No se supone que los valores son, en términos generales, "temporales", es decir, que serán invalidados al final de la expresión? Ser capaz de asignarlos me parece una tontería.

Respuestas a la pregunta(2)

Su respuesta a la pregunta