c++ c++11 move-semantics sequence-points

c++ - Se mueve dos veces en una sola expresión completa permitida



c++11 move-semantics (1)

Supongamos que uno tiene una función con el siguiente prototipo

template<typename T> std::unique_ptr<T> process_object(std::unique_ptr<T> ptr);

La función puede devolver (una versión movida de) el objeto que se le pasó, o un objeto completamente diferente.

¿Es legal C ++ usar esta función de la siguiente manera?

std::unique_ptr<Widget> pw(new Widget()); pw = process_object(std::move(pw));

Si recuerdo correctamente, hay una regla de C / C ++ que prohíbe modificar un objeto más de una vez en una sola expresión completa. ¿Se aplica esta regla aquí? En caso afirmativo, ¿hay alguna manera de expresar este idioma de manera diferente en una sola línea?

¿Qué pasa si uno reemplaza std::unique_ptr por el despreciado std::auto_ptr ?


¿Es legal C ++ usar esta función de la siguiente manera?

Si está bien.

Si recuerdo correctamente, hay una regla de C / C ++ que prohíbe modificar un objeto más de una vez en una sola expresión completa.

No exactamente. No puede modificar un objeto más de una vez (o modificarlo y usar su valor) con accesos sin secuencia.

¿Se aplica esta regla aquí?

No. La evaluación del argumento de la función se secuencia antes de la llamada a la función, que se secuencia antes de la asignación. Así que los dos accesos están secuenciados, y todo está bien.