Algunas aclaraciones sobre las referencias de valor

Primero: donde estánstd::move ystd::forward definido? Sé lo que hacen, pero no puedo encontrar pruebas de que se requiera ningún encabezado estándar para incluirlos. En gcc44 a vecesstd::move está disponible, y a veces no, por lo que sería útil una directiva de inclusión definitiva.

Al implementar la semántica de movimiento, la fuente se deja presumiblemente en un estado indefinido. ¿Debería este estado ser necesariamente un estado válido para el objeto? Obviamente, debe poder llamar al destructor del objeto y poder asignarlo por cualquier medio que la clase exponga. Pero, ¿deberían ser válidas otras operaciones? Supongo que lo que estoy preguntando es, si su clase garantiza ciertos invariantes, ¿debería esforzarse por hacer cumplir esos invariantes cuando el usuario ha dicho que ya no se preocupan por ellos?

A continuación: cuando no le importa la semántica de movimiento, ¿hay alguna limitación que pueda hacer que se prefiera una referencia no constante sobre una referencia de valor cuando se trata de parámetros de función?void function(T&); terminadovoid function(T&&); Desde la perspectiva de una persona que llama, poder pasar valores temporales de funciones es ocasionalmente útil, por lo que parece que uno debería otorgar esa opción siempre que sea posible hacerlo. Y las referencias de valor son en sí mismas valores, por lo que no puede llamar inadvertidamente un constructor de movimiento en lugar de un constructor de copia, o algo así. No veo un inconveniente, pero estoy seguro de que hay uno.

Lo que me lleva a mi pregunta final. Todavía no puede vincular temporarios a referencias no constantes. Pero puede vincularlos a referencias de valor no constantes. Y luego puede pasar esa referencia como una referencia no constante en otra función.

void function1(int& r) { r++; }
void function2(int&& r) { function1(r); }
int main() { 
    function1(5); //bad
    function2(5); //good
}

Además del hecho de que no hace nada, ¿hay algo malo con ese código? Mi instinto dice, por supuesto, que no, ya que cambiar las referencias de valor es el punto principal de su existencia. Y si el valor pasado es legítimamente constante, el compilador lo atrapará y le gritará. Pero, según todas las apariencias, este es un resumen de un mecanismo que presumiblemente se implementó por una razón, por lo que me gustaría confirmar que no estoy haciendo nada tonto.

Respuestas a la pregunta(3)

Su respuesta a la pregunta