¿Qué es la semántica de movimiento (move semantics) en C++11 y por qué es necesaria?
¡Hola! Acabo de empezar a estudiar C++11 y me encontré con el término «move semantics». Creo que entiendo que tiene algo que ver con el rendimiento, pero en la práctica no logro comprenderlo.
Supongamos que tengo una clase así:
```cpp
class MyString {
public:
MyString(const char* str) : data_(new char[strlen(str) + 1]) { strcpy(data_, str); }
~MyString() { delete[] data_; }
MyString(const MyString& other) : data_(new char[strlen(other.data_) + 1]) { strcpy(data_, other.data_); }
char* data_;
};
```
Escribo una función que devuelve un `MyString`:
```cpp
MyString createHello() {
MyString s("Hello, World!");
return s; // ¿Qué ocurre aquí? ¿Copia?
}
```
Usando el antiguo C++03, al retornar de la función se llamaba al constructor de copia, que asignaba nueva memoria y copiaba los datos. Esto es costoso. Pero he oído que en C++11 se pueden «mover» los datos para evitar la copia. ¿Cómo funciona esto? ¿Qué son las rvalue references y std::move? ¿Cuándo se usan?