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
.
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.