Avatar ·

¿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?