Avatar ·

O que é semântica de movimento (move semantics) em C++11 e por que ela é necessária?

Olá! Acabei de começar a estudar C++11 e me deparei com o termo "move semantics". Até entendo que está relacionado a desempenho, mas na prática não consigo entender. Digamos que eu tenha uma classe assim: ```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_; }; ``` Eu escrevo uma função que retorna `MyString`: ```cpp MyString createHello() { MyString s("Hello, World!"); return s; // O que acontece aqui? Cópia? } ``` Usando o antigo C++03, ao retornar da função, o construtor de cópia era chamado, que alocava nova memória e copiava os dados. Isso é caro. Mas ouvi dizer que em C++11 é possível "mover" os dados para evitar a cópia. Como isso funciona? O que são rvalue references e std::move? Quando usá-los?