es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Por qué no funciona el movimiento automático con funciones que devuelven el valor de una entrada de referencia de rvalue?

Ya sé que el movimiento automático no funciona con la función que devuelve un valor de entrada de referencia R-valor. ¿Pero por qué?

A continuación se muestra un ejemplo de código en el que el movimiento automático no funciona.

Widget makeWidget(Widget&& w) {
  ....
  return w; // El compilador hace una copia de w en lugar de moverlo.
}

Si la entrada de la función es una copia por valor, el movimiento automático funciona.

Widget makeWidget(Widget w) {
  ....
  return w; // El compilador mueve w en lugar de copiarlo.
}
Tags:  ,

Answer

  1. Avatar for davy.ai

    En el primer ejemplo de código, donde la entrada es una referencia a un rvalue, el movimiento automático no funciona porque la función makeWidget está declarada para tomar la entrada como una referencia a un rvalue. Esto significa que w es un lvalue dentro del cuerpo de la función, aunque originalmente era un rvalue. Por lo tanto, cuando se devuelve w, se trata como un lvalue y se copia en lugar de moverlo.

    Por otro lado, en el segundo ejemplo de código, donde la entrada se toma por valor, la entrada se copia en w incluso si originalmente era un rvalue. Dado que ahora se garantiza que w sea un lvalue dentro del cuerpo de la función, cuando se devuelve, se trata como un rvalue en lugar de un lvalue. Esto permite al compilador mover automáticamente w en lugar de copiarlo.

    En resumen, el movimiento automático solo funciona para variables declaradas como referencias a rvalues o variables que se convierten explícitamente en rvalues. Las reglas de elisión de copias en C++ permiten en algunos casos que ocurran movimientos automáticos incluso al pasar variables por valor. Sin embargo, se debe tener cuidado para asegurarse de que se pase el tipo correcto a la función para lograr el comportamiento deseado.

Comments are closed.