Returning an argument passed by rvalue reference

Si tengo una claseA y funciones

A f(A &&a)
{
  doSomething(a);
  return a;
}
A g(A a)
{
  doSomething(a);
  return a;
}

el constructor de la copia se llama al regresara def, pero el constructor de movimiento se usa al regresar deg. Sin embargo, por lo que entiendo,f solo se puede pasar un objeto que sea seguro mover (ya sea un objeto temporal o un objeto marcado como movible, por ejemplo, usandostd::move) ¿Hay algún ejemplo cuando no sería seguro usar el constructor de movimiento al regresar def? ¿Por qué requerimosa tener duración de almacenamiento automático?

Leo las respuestasaquí, pero la respuesta principal solo muestra que la especificación no debe permitir moverse al pasara a otras funciones en el cuerpo de la función; no explica por qué moverseal regresar es seguro parag pero no paraf. Una vez que lleguemos a la declaración de devolución, no necesitaremosa más adentrof.

Actualización 0

Así que entiendo que los temporales son accesibles hasta el final de la expresión completa. Sin embargo, el comportamiento al regresar def Todavía parece ir en contra de la semántica arraigada en el lenguaje de que es seguro mover un valor temporal o x. Por ejemplo, si llamasg(A()), lo temporal se mueve al argumento parag a pesar de que podría haber referencias a lo temporal almacenado en algún lugar. Lo mismo sucede si llamamosg con un xvalue. Dado que solo los valores temporales y los valores x se unen a las referencias de valor, parece ser coherente con la semántica que aún debemos movera al regresar def, ya que sabemosa se pasó ya sea temporal o xvalue.

Respuestas a la pregunta(3)

Su respuesta a la pregunta