C++11中的T&&(双与号)是什么意思?
大家好!我开始学习C++11,遇到了一个奇怪的语法——在函数参数和模板声明中的双与号`&&`。例如,我看到过这样的代码:
```cpp
template
void foo(T&& arg) {
// 一些代码
}
```
或者在移动构造函数中:
```cpp
class MyClass {
public:
MyClass(MyClass&& other) noexcept;
};
```
我知道单个`&`是引用(lvalue-reference)。但双与号是做什么的?网上说这是“rvalue-reference”,但我不太清楚它与普通引用有什么区别以及为什么需要它。似乎这与移动语义(move semantics)和完美转发(perfect forwarding)有关,但我无法形成完整的理解。
你能用简单的例子解释一下吗?我特别感兴趣的是:
1. 在模板中`T&&`是如何工作的——它总是rvalue吗?
2. 为什么有时说`T&&`既可以是lvalue又可以是rvalue?
3. 如何一起使用`std::move`和`std::forward`?