Avatar ·

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