¿Qué significa T&& (doble ampersand) en C++11?
¡Hola, colegas! Empecé a estudiar C++11 y me encontré con una sintaxis extraña: el doble ampersand `&&` en la declaración de parámetros de funciones y plantillas. Por ejemplo, he visto código como este:
```cpp
template
void foo(T&& arg) {
// algún código
}
```
O en la implementación de un move-constructor:
```cpp
class MyClass {
public:
MyClass(MyClass&& other) noexcept;
};
```
Entiendo que un solo `&` es una referencia (lvalue-reference). Pero, ¿qué hace el doble ampersand? En internet escriben que es una "rvalue-reference", pero no me queda claro en qué se diferencia de una referencia normal y para qué sirve. Parece que está relacionado con la semántica de movimiento (move semantics) y el reenvío perfecto (perfect forwarding), pero no logro tener una visión completa.
¿Podrían explicarlo con ejemplos simples? Me interesa especialmente:
1. ¿Cómo funciona `T&&` en plantillas? ¿Siempre es rvalue o no?
2. ¿Por qué a veces se dice que `T&&` puede ser tanto lvalue como rvalue?
3. ¿Cómo usar `std::move` y `std::forward` junto con esto?