Avatar ·

O que significa T&& (duplo e comercial) em C++11?

Olá! Comecei a estudar C++11 e me deparei com a nova notação `T&&` no código. Eu entendo que `&` é uma referência, e `&&` é um "E" lógico. Mas no contexto de tipos, é algo diferente.\n\nPor exemplo, vi este código:\n\n```cpp\ntemplate\nvoid foo(T&& arg) {\n // fazemos algo\n}\n```\n\nE também:\n\n```cpp\nvoid bar(std::vector&& vec) {\n // ...\n}\n```\n\nNo começo, pensei que `T&&` fosse uma "referência a referência", o que parece sem sentido. Depois li que isso é chamado de "rvalue reference". Mas não entendo para que serve. Qual é a diferença entre `T&` e `T&&`? Quando devo usar `T&&` em vez de `T&` ou `const T&`? E o que é "perfect forwarding", sobre o qual todos falam?\n\nExplique, por favor, com exemplos simples. Acho que estou perdendo algo importante no C++ moderno.