Sé que al pasar un objeto por valor a una función, el constructor de movimiento siempre se llama si hay uno, suponiendo que no se copia elisión. ¿Qué hay de devolver un objeto por valor?¿Se garantiza que un objeto se moverá cuando se devuelva?
Por ejemplo, supongamos que tenemos una clase Foo
que tiene un constructor de movimiento, y tenemos una función que devuelve un objeto Foo
.
Foo g() {
Foo f;
// do something with f
return f;
}
Si suponemos que no hay ningún RVO, ¿se garantiza que se llamará al constructor de movimiento?
Actualización: Creo que no mostré mi intención claramente. Solo quiero saber que puedo, en el peor de los casos, mover el objeto no copiado. O bien ocurre RVO o NRVO, estoy contento. Y también debería decir que el constructor de movimientos y la asignación de movimiento no se eliminan y se implementan correctamente.
Sí, los objetos locales en el almacenamiento automático se tratan implícitamente como xvalues en declaraciones de devolución. – ildjarn
@ildjarn: Creo que es solo si lo devuelve directamente. En algún lugar en SO me corrigieron diciendo que esto movía 'f' a la función:' return do_something (f); '. – GManNickG
@GManNickG: No tuve tiempo para el estándar o las advertencias, de ahí un comentario en lugar de una respuesta. Creo que tienes razón. : -] – ildjarn