c++ - ¿Los tipos incorporados tienen semántica de movimiento?
move constructor c++ (1)
Entonces, ¿el que se muestra en el ejemplo es un comportamiento bien definido?
Sí, el comportamiento que se muestra en el ejemplo es el único comportamiento permitido por el estándar. Eso es porque std::move
no se mueve. Las cosas que se mueven son constructores de movimiento y operadores de asignación de movimiento.
Todo lo que hace std::move
es cambiar un valor l en un valor x, de modo que se pueda unir a las referencias rvalue. No invoca a ningún constructor ni a nada más. Cambiar la categoría de valor ocurre en el nivel de tipo. Nada sucede en tiempo de ejecución.
Las referencias de Rvalue siguen siendo referencias: se refieren al objeto original. La función incrementa el entero original a través de la referencia dada.
Si una función toma un argumento por referencia, no se producen copias ni movimientos: el objeto original está vinculado a la referencia.
Si una función toma un argumento por valor, entonces podríamos tener un movimiento.
Sin embargo, los tipos fundamentales no tienen constructores de movimiento. Los movimientos se degradan a copias en ese caso.
Considera este código:
#include <iostream>
using namespace std;
void Func(int&& i) {
++i;
}
int main() {
int num = 1234;
cout << "Before: " << num << endl;
Func(std::move(num));
cout << "After: " << num << endl;
}
Su salida es:
Before: 1234
After: 1235
Claramente, i
siendo modificado dentro de Func
, ya que está vinculado al parámetro i
después de ser "convertido" a una referencia de valor r por std::move
.
Bueno, mi punto:
Mover un objeto significa transferir la propiedad de los recursos de un objeto a otro. Sin embargo, los tipos incorporados no tienen recursos porque ellos mismos son los recursos. No tiene sentido transferir los recursos que poseen. Como se muestra en el ejemplo, el valor de num
se modifica. Su recurso, su yo, es el que está siendo modificado.
¿Los tipos incorporados tienen semántica de movimiento?
Además, ¿Los objetos de tipo incorporados después de que se muevan (si lo es) tienen un comportamiento bien definido?