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?