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.

Bug reportado en C++ Primer 5th Edición con std::move

Miré un ejemplo en C++ Primer que explica std::move. El ejemplo es el siguiente:

int &&rr1 = 42;
int &&rr3 = std::move(rr1);

En la explicación del fragmento de código anterior, se dice lo siguiente:

“Al llamar a move se le indica al compilador que tenemos un lvalue que queremos tratar como si fuera un rvalue. Es esencial darse cuenta de que la llamada a move promete que no tenemos la intención de usar rr1 nuevamente, excepto para asignarle un valor o destruirlo. Después de una llamada a move, no podemos hacer ninguna suposición sobre el valor del objeto movido”.

Mi primera pregunta es: ¿Ahora puedo escribir de manera segura std::cout << rr1;? Ya que en el párrafo anterior se indica que no podemos hacer suposiciones sobre el valor del objeto movido, ¿se garantiza por el estándar que std::cout << rr1; es seguro (no tiene comportamiento indefinido o depende de la implementación, etc.)?

Aquí hay otro ejemplo:

std::string str = "abc";
auto &&str2 = std::move(str);
cout << str; // ¿es seguro esto (no tiene comportamiento indefinido o depende de la implementación)?

De manera similar, en el fragmento de código anterior, ¿es seguro usar el valor de str como cout << str;?

Si la respuesta es sí, ¿es esto un error o bug en el libro C++ Primer de Stanley?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Según la explicación proporcionada en la cita, no es seguro hacer suposiciones sobre el valor del objeto movido después de llamar a std::move. Por lo tanto, no es seguro escribir std::cout << rr1; en el primer ejemplo, ya que podría dar lugar a un comportamiento indefinido o depender de la implementación.

    De manera similar, en el segundo ejemplo, no es seguro usar el valor de str después de mover su contenido a str2 usando std::move.

    No es un error o un fallo en el libro “C++ Primer” de Stanley, ya que explica correctamente el comportamiento de std::move y las precauciones que se deben tomar al usarlo. Para usar de forma segura el objeto después de mover su contenido, debemos asignarle un nuevo valor o destruirlo.

Comments are closed.